最近项目在做一个基于UDP模式的通信程序,考虑到项目的需求有一对多的需要,所以采用socket UDP广播模式进行数据通信。网上了解了一下知道这种模式也是目前QQ采用的方式,于是为了更好的理解socket UDP,觉得先花点时间做一个局域网群聊的小工具。
先把效果图展示一下。经过测试发现能够支持三个以上的人共同聊天,至于上限是多少没去测过。
在这里特别容易出错的是,如果你用的是笔记本会有多个网卡,对网卡的选择不对,会导致数据无法发送。所以打开程序的时候会先输入网卡的IP地址。
点击确定即可。
代码其实很简单。这里贴出主要的部分,全部工程可以去下载。
第一部分,socket的初始化。
CString str; str=theApp.HostName+" "+theApp.IpStr; SetWindowText(str);
m_LocalSock.SetDialog(this); text=_T("");
m_LocalSock.Create(8021, SOCK_DGRAM, theApp.IpStr);
BOOL bCmdOpt = TRUE; m_LocalSock.SetSockOpt(SO_BROADCAST, (void*)&bCmdOpt, 1); |
第二部分,数据的发送
CString szSendInfo; //发送信息 GetDlgItem(IDC_EDIT2)->GetWindowText(szSendInfo); //获取发送信息 if(szSendInfo=="") return; szSendInfo=theApp.HostName+_T(":")+szSendInfo;
int nSendPort = 8021; SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr= INADDR_BROADCAST; addr.sin_port = htons(nSendPort); m_LocalSock.SendTo(szSendInfo.GetBuffer(0), szSendInfo.GetLength(), (SOCKADDR*)&addr, sizeof(addr));
GetDlgItem(IDC_EDIT2)->SetWindowText("");
|
第三部分,数据的接收
char pBuffer[1024] = {0}; CString szIP; UINT nPort; int nRecvNum = socket.ReceiveFrom(pBuffer, 1024, szIP, nPort); if (nRecvNum != -1) { if (text==_T("")) { text=pBuffer; } else { text+="\r\n"; text+=pBuffer; } GetDlgItem(IDC_EDIT1)->SetWindowText(text); } |
可运行工程下载路径:点击打开链接