【UDP】如何区分是广播包,还是普通包?伪代码如下:C/C++ codesockaddr_infrom,aWSADATAwsdataBOOLoptval
【UDP】如何区分是广播包,还是普通包?
伪代码如下:
C/C++ code sockaddr_in from,a; WSADATA wsdata; BOOL optval = TRUE; u_short uPort = m_nPort; if(WSAStartup(0x0202,&wsdata) != 0) { CString strErr; strErr.Format(_T("WSAStartup Init failed! Error code:%d"),WSAGetLastError()); AddNote(strErr); _endthreadex(0); return FALSE; } a.sin_family = AF_INET; a.sin_addr.s_addr = 0; a.sin_port = htons(uPort); from.sin_family = AF_INET; from.sin_addr.s_addr = INADDR_BROADCAST; from.sin_port = htons(uPort); int fromlength=sizeof(SOCKADDR); pThread->m_socket = socket(AF_INET,SOCK_DGRAM,0); setsockopt(pThread->m_socket,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval)); bind(pThread->m_socket,(sockaddr *)&a,sizeof(sockaddr_in)); strInit.Format(_T("Port: %d Now waiting for clients..."),uPort); AddNote(strInit); while(true) { nLen = recvfrom(pThread->m_socket,buf,BUF_MAX_LEN,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength); if(nLen > 0) { // 这里如何区分是广播包,还是普通包? } }
当执行完recvfrom之后,我仔细看了from这个变量,也没发现有什么变化。
请教一下,这里如何区分是广播包,还是普通包?
[解决办法]能否分析IP头中的目的IP信息,如果目的IP为广播地址则说明是广播数据包。
[解决办法]Raw socket,写个嗅探程序
[解决办法]抓包等,然后查看包的目的地址.是否为广播IP地址
[解决办法]为广播地址 为广播包 例如 192.168.1.255 或者 255.255.255.255 之类的 但也可能不是
[解决办法]可以用winpcap 开发,监视数据包,然后区分出源地址,看是否是广播包
这里有两个连接,可以参考一下
http://www.cnblogs.com/phinecos/archive/2008/10/20/1315176.html
http://blog.csdn.net/yzw289525118/article/details/1604747
[解决办法]raw socket,解析IP首部
[解决办法]from只能看到转发机子得IP?
不是吧,我怎么记得这里面存的就是源啊。
[解决办法]getpeername();里面是什么了?看下会不会是广播地址。
[解决办法][解决办法] nLen = recvfrom(pThread->m_socket,buf,BUF_MAX_LEN,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
没变化说明是广播包。这个from是被自动填充的。你设置的是广播地址,现在接收的又是广播地址,自然不变咯!
[解决办法]先获取他的源IP地址跟子网掩码
有子网掩码的话,就很好区分,UDP的源IP主机位全为1的肯定广播报,另,255.255.255.255是广播报文;
[解决办法]33663168这个网络字节序的ip地址是192.168.1.2。你是不是让这台主机给自己发送数据的,那就都是普通包,不是广播包咯!
[解决办法]你要确保你的本地地址在在广播地址段内,如果不在的话,广播包是不能发送到你的主机的。(据说通过路由器设置可以转发广播包)
[解决办法]获取他的源IP地址跟子网掩码,再分析出来