- 先版本信息调用函数
- AfxSocketInit
- 1
- BOOL CChatDlg::InitSocket()
- {
- m_socket=socket(AF_INET,SOCK_DGRAM,0);
- if(INVALID_SOCKET==m_socket)
- {
- MessageBox("套接字创建失败!");
- return FALSE;
- }
- SOCKADDR_IN addrSock;
- addrSock.sin_family=AF_INET;
- addrSock.sin_port=htons(6000);
- addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
- int retval;
- retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
- if(SOCKET_ERROR==retval)
- {
- closesocket(m_socket);
- MessageBox("绑定失败!");
- return FALSE;
- }
- return TRUE;
- }
2,
- CreateThread第三个参数接受数据是个指针,写一个结构体,就可以接受好几个参数了
- struct RECVPARAM
- {
- SOCKET sock;
- HWND hwnd;
- };
- RECVPARAM *pRecvParam=new RECVPARAM;
- pRecvParam->sock=m_socket;
- pRecvParam->hwnd=m_hWnd;
- HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
- CloseHandle(hThread);
3。面向对象时不使用全局,可以在方法前加static,这样方法不属于对象,只属于类的
- static DWORD WINAPI RecvProc(LPVOID lpParameter);
4.接收端数据
- DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
- {
- SOCKET sock=((RECVPARAM*)lpParameter)->sock;
- HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
- delete lpParameter; //视频讲述时,遗忘了释放内存的操作。sunxin
- SOCKADDR_IN addrFrom;
- int len=sizeof(SOCKADDR);
- char recvBuf[200];
- char tempBuf[300];
- int retval;
- while(TRUE)
- {
- retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
- if(SOCKET_ERROR==retval)
- break;
- sprintf(tempBuf,"%s说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
- ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//传给对话框值使用发送消息,自定义消息
- }
- return 0;
- }
自定义消息
- void CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
- {
- CString str=(char*)lParam;
- CString strTemp;
- GetDlgItemText(IDC_EDIT_RECV,strTemp);
- str+="\r\n";
- str+=strTemp;
- SetDlgItemText(IDC_EDIT_RECV,str);
- }
5.接收端
- void CChatDlg::OnBtnSend()
- {
- // TODO: Add your control notification handler code here
- DWORD dwIP;
- ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
- SOCKADDR_IN addrTo;
- addrTo.sin_family=AF_INET;
- addrTo.sin_port=htons(6000);
- addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
- CString strSend;
- GetDlgItemText(IDC_EDIT_SEND,strSend);
- sendto(m_socket,strSend,strSend.GetLength()+1,0,
- (SOCKADDR*)&addrTo,sizeof(SOCKADDR));
- SetDlgItemText(IDC_EDIT_SEND,"");
- }
1856

被折叠的 条评论
为什么被折叠?



