首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

【UDP】怎么区分是广播包,还是普通包

2012-09-04 
【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();里面是什么了?看下会不会是广播地址。
[解决办法]
探讨

引用:

getpeername();里面是什么了?看下会不会是广播地址。


看来只能RAW了,只是解析麻烦点而已

[解决办法]
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地址跟子网掩码,再分析出来

热点排行