实验室系统:Windows10
实验室IDE:VS2012
创建MFC文件项目
文件->新建->项目
然后根据图片进行操作
注意的地方:
1.取消union库
2.勾选上Windows套接字,让系统自动帮我们生成
3.选择Dlog
添加控件
点开工具箱
建立两个主框,一个用来接收数据,一个用来发送数据
再在主框里面建立3个edit,一个用来显示发送来的数据,一个用来显示自己发送的数据,下面那个用来显示要发送的数据
最后删掉原有,并加一个按钮为发送,添加一个ip控制
编写代码
加载套接字数据库
先手到我们的cpp中,因为我们之前选择了Windows套接字库,所以会给我们生成好
我们也可以让系统提示我们是否加载失败
1 2 3 4 5 6 7
| CWinApp::InitInstance(); if (!AfxSocketInit()) { AfxMessageBox("Load socket"); return FALSE; }
|
接着我们去查看是包含了头文件
看到这个说明没有问题
然后我们去头文件中去定义。
然后我们去写初始化的函数体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| BOOL CSorgsDlg::InitSocket(){ msocket = socket(AF_INET,SOCK_DGRAM,0); if (INVALID_SOCKET == msocket) { MessageBox("create socket false"); return FALSE; } SOCKADDR_IN acceptSock; acceptSock.sin_family = AF_INET; acceptSock.sin_port = htons(6000); acceptSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY); int retval = 0; bind(msocket,(SOCKADDR *)&acceptSock,sizeof(SOCKADDR)); if (SOCKET_ERROR == retval) { closesocket(msocket); MessageBox("bind false"); return FALSE; } return TRUE; }
|
写完了我们的函数,我们需要去设置加载它的地方。
在这个函数中去调用我么的初始化套接字函数
1
| BOOL CSorgsChatDlg::OnInitDialog()
|
接收端
现在开始接收端的程序,为解决CreateThread中的LPVOID只能传递一个参数值的问题,我们首先去头文件穿件一个一个结构体
1 2 3 4 5 6
| struct RECVPARAM { SOCKET sock; HWND hwnd; };
|
定义套接字的指针
接下来去定义套接字的指针和串口句柄(现在刚刚调用初始化套接字函数的下面)
1 2 3 4 5 6 7 8
| RECVPARAM *mRecvParam = new RECVPARAM; mRecvParam->sock = msocket; mRecvParam->hwnd = m_hWnd; HANDLE mThread = CreateThread(NULL,0,Threadpro,(LPVOID)mRecvParam,0,NULL); CloseHandle(mThread);
|
为了使用完全使用面向对象的方式,我们去头文件进行定义
1 2 3 4 5 6
| static DWORD WINAPI Threadpro(LPVOID mlpvpid);
|
Threadpro
然后开始编写Threadpro函数体
发送消息的函数
然后就是去编写发送消息的函数
先去我们的MFC界面双击发送按钮,生成点击事件按钮
并右键属性,去知道我们的显示发送和显示接收数据的ID号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| void CSorgsDlg::OnBnClickedButton1() { DWORD dwIP; ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SOCKADDR_IN ToSock; ToSock.sin_family = AF_INET; ToSock.sin_port = htons(6000); ToSock.sin_addr.S_un.S_addr= htonl(dwIP); CString strSend; GetDlgItemText(IDC_EDIT4,strSend); sendto(msocket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&ToSock,sizeof(SOCKADDR)); SetDlgItemText(IDC_EDIT4,""); CString strto; GetDlgItemText(IDC_EDIT3,strto); strto +="\r\n"; strto +="帅帅的自己说:"; strto += strSend; SetDlgItemText(IDC_EDIT3,strto); }
|
消息响应
然后我们在去编写消息响应函数
在头文件中写入函数声明
消息映射
然后去编写消息映射
然后去写函数体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| LRESULT CSorgsDlg::MRecvData(WPARAM wParam,LPARAM lParam){ CString str = (char*)lParam; CString strTemp; GetDlgItemText(IDC_EDIT2,strTemp); str += "\r\n"; str +=strTemp; SetDlgItemText(IDC_EDIT2,str); return TRUE; }
|
自此,我们代码编写完毕
优化控件
使显示框分行
右键属性把Multiline设置为true
按钮回车发送和不显示按钮
右键按钮属性
测试
这里我们使用127.0.0.1回环地址进行测试
这样就说明没有问题了
最后更新时间:
感谢观看