为什么在广播后,自己连续收到了四次消息,该如何解决
为什么在广播后,自己连续收到了四次消息
代码:
#include <conio.h>
#include <iostream>
#include <winsock2.h>
#pragma comment( lib, "ws2_32.lib" )
#define BUF_SIZE 1024
using namespace std;
int main( int args, char *argv[] )
{
WSAData wsaData;
int nResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if( nResult != 0 )
{
cout<< "WSAStartup failed!" <<endl;
return -1;
}
SOCKET udp_sd = socket( AF_INET, SOCK_DGRAM, 0 );
if( INVALID_SOCKET == udp_sd )
{
cout<< "socket failed!" <<endl;
WSACleanup();
return -1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons( 5300 );
addr.sin_addr.s_addr = INADDR_ANY;
int nlength = sizeof( sockaddr_in );
nResult = bind( udp_sd, (sockaddr *)&addr, nlength );
if( 0 != nResult )
{
cout<< "Bind 127.0.0.1:5300 Failed!" <<endl;
closesocket( udp_sd );
WSACleanup();
return -1;
}
bool optval = true;
int optlen = sizeof(bool);
unsigned long nValue = 1;
setsockopt( udp_sd, SOL_SOCKET, SO_BROADCAST, (char *)&optval, optlen );
ioctlsocket( udp_sd, FIONBIO, (u_long *)&nValue );
char buf[BUF_SIZE] = { 0 };
sockaddr_in addr_dest;
addr_dest.sin_family = AF_INET;
addr_dest.sin_port = htons( 5300 );
addr_dest.sin_addr.s_addr = INADDR_BROADCAST;
sockaddr_in addr_src;
bool bExit = false;
int nCount = 0;
while( !bExit )
{
if( _kbhit() )
{
gets( buf );
if( stricmp( buf, "quit") == 0 ||
stricmp( buf, "exit") == 0 )
{
bExit = true;
}
else
{
sendto( udp_sd, buf, strlen(buf), 0, (sockaddr *)&addr_dest, nlength );
}
}
memset( buf, 0, BUF_SIZE);
int nRecv = recvfrom( udp_sd, buf, BUF_SIZE, 0, (LPSOCKADDR)&addr_src, &nlength );
if( nRecv > 0 )
{
++nCount;
cout<< inet_ntoa( addr_src.sin_addr ) << " say : " << buf <<endl;
cout<< nCount <<endl;
}
Sleep( 1000 );
}
shutdown( udp_sd, FD_CLOSE );
closesocket( udp_sd );
return 0;
}
运行结果:输入消息回车后,打印出来最后nCount=4,对四次打印出来的消息都是一样。
求高手解答为什么会出现这样的结果?谢谢!
------解决方案--------------------
你有四个网络适配器 设备?
不懂,路过。
------解决方案--------------------
抓包调试。。。看看返回的数据包 原ip mac是什么。。。
代码:
#include <conio.h>
#include <iostream>
#include <winsock2.h>
#pragma comment( lib, "ws2_32.lib" )
#define BUF_SIZE 1024
using namespace std;
int main( int args, char *argv[] )
{
WSAData wsaData;
int nResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
if( nResult != 0 )
{
cout<< "WSAStartup failed!" <<endl;
return -1;
}
SOCKET udp_sd = socket( AF_INET, SOCK_DGRAM, 0 );
if( INVALID_SOCKET == udp_sd )
{
cout<< "socket failed!" <<endl;
WSACleanup();
return -1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons( 5300 );
addr.sin_addr.s_addr = INADDR_ANY;
int nlength = sizeof( sockaddr_in );
nResult = bind( udp_sd, (sockaddr *)&addr, nlength );
if( 0 != nResult )
{
cout<< "Bind 127.0.0.1:5300 Failed!" <<endl;
closesocket( udp_sd );
WSACleanup();
return -1;
}
bool optval = true;
int optlen = sizeof(bool);
unsigned long nValue = 1;
setsockopt( udp_sd, SOL_SOCKET, SO_BROADCAST, (char *)&optval, optlen );
ioctlsocket( udp_sd, FIONBIO, (u_long *)&nValue );
char buf[BUF_SIZE] = { 0 };
sockaddr_in addr_dest;
addr_dest.sin_family = AF_INET;
addr_dest.sin_port = htons( 5300 );
addr_dest.sin_addr.s_addr = INADDR_BROADCAST;
sockaddr_in addr_src;
bool bExit = false;
int nCount = 0;
while( !bExit )
{
if( _kbhit() )
{
gets( buf );
if( stricmp( buf, "quit") == 0 ||
stricmp( buf, "exit") == 0 )
{
bExit = true;
}
else
{
sendto( udp_sd, buf, strlen(buf), 0, (sockaddr *)&addr_dest, nlength );
}
}
memset( buf, 0, BUF_SIZE);
int nRecv = recvfrom( udp_sd, buf, BUF_SIZE, 0, (LPSOCKADDR)&addr_src, &nlength );
if( nRecv > 0 )
{
++nCount;
cout<< inet_ntoa( addr_src.sin_addr ) << " say : " << buf <<endl;
cout<< nCount <<endl;
}
Sleep( 1000 );
}
shutdown( udp_sd, FD_CLOSE );
closesocket( udp_sd );
return 0;
}
运行结果:输入消息回车后,打印出来最后nCount=4,对四次打印出来的消息都是一样。
求高手解答为什么会出现这样的结果?谢谢!
------解决方案--------------------
你有四个网络适配器 设备?
不懂,路过。
------解决方案--------------------
抓包调试。。。看看返回的数据包 原ip mac是什么。。。