UDP通信,只发送了一次,服务端却收到三次。 服务器非阻塞,循环接收100次。对UDP不是很熟,没有用select。客户端发送一次。求解。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大致代码如下: // server SOCKET sock; sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (INVALID_SOCKET == sock) { TRACE("Create broadcast socket error,error code:%d\n" ,WSAGetLastError()); return -1; } SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(8777); addr.sin_addr.s_addr = INADDR_ANY; bool bOpt = true; setsockopt(*sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)); int iMode = 1; ioctlsocket(*sock,FIONBIO, (u_long FAR*) &iMode); int nRet = bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR)); if (SOCKET_ERROR == nRet) { TRACE("Bind broadcast socket error,error code:%d\n" ,WSAGetLastError()); return -1; } const int sizeBuffLen = 1024; char pRecvBuff[sizeBuffLen] = {0}; int nAddrSize = sizeof(SOCKADDR); while(1) { memset(pRecvBuff ,0 ,sizeBuffLen); int nRecSize = recvfrom(sock, pRecvBuff, sizeBuffLen, 0, (SOCKADDR*)&addr, &nAddrSize); if(SOCKET_ERROR == nRecSize) { TRACE("Received broadcast data error,error code:%d\n" ,WSAGetLastError()); return -1; } RecvData(pRecvBuff ,nRecSize); } closesocket(sock); //client SOCKET sock; sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (INVALID_SOCKET == sock) { TRACE("Create broadcast socket error,error code:%d\n" ,WSAGetLastError()); return -1; } SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(8777); addr.sin_addr.s_addr = INADDR_BROADCAST; bool bOpt = true; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)); int nAddrSize = sizeof(SOCKADDR); char *pBuff = "test msg"; int nSendSize = sendto(sock, (const char*)pBuff, strlen(pBuff), 0, (SOCKADDR*)&addr, nAddrSize); if(SOCKET_ERROR == nSendSize) { TRACE("Send broadcast data error,error code:%d\n" ,WSAGetLastError()); return -1; } closesocket(sock); 你这段代码服务器端收到三个"test msg"? 是啊,我也不知道为什么会这样。RecvData(pRecvBuff ,nRecSize);被调用了三次,而且传入的数据都是相同的数据。之前的Buffer都有清空。我暂时是收到相同数据忽略下面次的数据。但是这样就留下了一个Bug。哎,实在不知道为啥会这样。 最好用网络截包工具看看发包情况,例如wireshark 我也遇到这种情况,不过用的是TCP协议,楼主解决掉那个问题没? 菜鸟求救:MFC中如何编写程序来查询数据库中的内容 GDI+计算文字的像素值 如何同自定义的windows服务进行交互 超级散分,急,急,急 CDataGrid的问题 求教:关于对话框的OnKeyDown()的响应 VC6,如何修改EXCEL表中某个SHEET的名称? opengl 的编译错误 从网上找了一天,help 如何像金山毒霸那样,在变化窗口时有动态滚动的效果? 如何在ListCtrl的头上显示位图? 请教VC运行环境 用WMPSDK播放mms视频是否可能再其中加入自己的logo?
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (INVALID_SOCKET == sock)
{
TRACE("Create broadcast socket error,error code:%d\n" ,WSAGetLastError());
return -1;
} SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8777);
addr.sin_addr.s_addr = INADDR_ANY;
bool bOpt = true;
setsockopt(*sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
int iMode = 1;
ioctlsocket(*sock,FIONBIO, (u_long FAR*) &iMode); int nRet = bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR));
if (SOCKET_ERROR == nRet)
{
TRACE("Bind broadcast socket error,error code:%d\n" ,WSAGetLastError());
return -1;
}
const int sizeBuffLen = 1024;
char pRecvBuff[sizeBuffLen] = {0};
int nAddrSize = sizeof(SOCKADDR);
while(1)
{
memset(pRecvBuff ,0 ,sizeBuffLen);
int nRecSize = recvfrom(sock, pRecvBuff, sizeBuffLen, 0, (SOCKADDR*)&addr, &nAddrSize);
if(SOCKET_ERROR == nRecSize)
{
TRACE("Received broadcast data error,error code:%d\n" ,WSAGetLastError());
return -1;
}
RecvData(pRecvBuff ,nRecSize);
}
closesocket(sock);
//client
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (INVALID_SOCKET == sock)
{
TRACE("Create broadcast socket error,error code:%d\n" ,WSAGetLastError());
return -1;
} SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8777);
addr.sin_addr.s_addr = INADDR_BROADCAST;
bool bOpt = true;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
int nAddrSize = sizeof(SOCKADDR);
char *pBuff = "test msg";
int nSendSize = sendto(sock, (const char*)pBuff, strlen(pBuff), 0, (SOCKADDR*)&addr, nAddrSize);
if(SOCKET_ERROR == nSendSize)
{
TRACE("Send broadcast data error,error code:%d\n" ,WSAGetLastError());
return -1;
}
closesocket(sock);
我也不知道为什么会这样。
RecvData(pRecvBuff ,nRecSize);
被调用了三次,而且传入的数据都是相同的数据。
之前的Buffer都有清空。
我暂时是收到相同数据忽略下面次的数据。
但是这样就留下了一个Bug。
哎,实在不知道为啥会这样。