c++多线程编写网络聊天室程序(socket)

  1. 先版本信息调用函数  
  1. AfxSocketInit  
  1.   
  1. 1  
  1.   
  1. BOOL CChatDlg::InitSocket()  
  2. {  
  3.     m_socket=socket(AF_INET,SOCK_DGRAM,0);  
  4.     if(INVALID_SOCKET==m_socket)  
  5.     {  
  6.         MessageBox("套接字创建失败!");  
  7.         return FALSE;  
  8.     }  
  9.     SOCKADDR_IN addrSock;  
  10.     addrSock.sin_family=AF_INET;  
  11.     addrSock.sin_port=htons(6000);  
  12.     addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  
  13.   
  14.     int retval;  
  15.     retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));  
  16.     if(SOCKET_ERROR==retval)  
  17.     {  
  18.         closesocket(m_socket);  
  19.         MessageBox("绑定失败!");  
  20.         return FALSE;  
  21.     }  
  22.     return TRUE;  
  23.   
  24. }  


2,

  1. CreateThread第三个参数接受数据是个指针,写一个结构体,就可以接受好几个参数了  
  1. struct RECVPARAM  
  2. {  
  3.     SOCKET sock;  
  4.     HWND hwnd;  
  5. };  

  1.   
  1. RECVPARAM *pRecvParam=new RECVPARAM;  
  2.     pRecvParam->sock=m_socket;  
  3.     pRecvParam->hwnd=m_hWnd;  
  4.     HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);  
  5.     CloseHandle(hThread);  

3。面向对象时不使用全局,可以在方法前加static,这样方法不属于对象,只属于类的
  1. static DWORD WINAPI RecvProc(LPVOID lpParameter);  


4.接收端数据

  1. DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)  
  2. {  
  3.     SOCKET sock=((RECVPARAM*)lpParameter)->sock;  
  4.     HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;  
  5.     delete lpParameter; //视频讲述时,遗忘了释放内存的操作。sunxin  
  6.   
  7.     SOCKADDR_IN addrFrom;  
  8.     int len=sizeof(SOCKADDR);  
  9.   
  10.     char recvBuf[200];  
  11.     char tempBuf[300];  
  12.     int retval;  
  13.     while(TRUE)  
  14.     {  
  15.         retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);  
  16.         if(SOCKET_ERROR==retval)  
  17.             break;  
  18.         sprintf(tempBuf,"%s说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);  
  19.         ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//传给对话框值使用发送消息,自定义消息  
  20.     }  
  21.     return 0;  
  22. }  

自定义消息
  1. void CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)  
  2. {  
  3.     CString str=(char*)lParam;  
  4.     CString strTemp;  
  5.     GetDlgItemText(IDC_EDIT_RECV,strTemp);  
  6.     str+="\r\n";  
  7.     str+=strTemp;  
  8.     SetDlgItemText(IDC_EDIT_RECV,str);  
  9. }  

5.接收端
  1. void CChatDlg::OnBtnSend()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     DWORD dwIP;  
  5.     ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);  
  6.   
  7.     SOCKADDR_IN addrTo;  
  8.     addrTo.sin_family=AF_INET;  
  9.     addrTo.sin_port=htons(6000);  
  10.     addrTo.sin_addr.S_un.S_addr=htonl(dwIP);  
  11.   
  12.     CString strSend;  
  13.     GetDlgItemText(IDC_EDIT_SEND,strSend);  
  14.     sendto(m_socket,strSend,strSend.GetLength()+1,0,  
  15.         (SOCKADDR*)&addrTo,sizeof(SOCKADDR));  
  16.     SetDlgItemText(IDC_EDIT_SEND,"");  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值