-
-
[求助]关于网络编程中遇到的稀里糊涂的问题
-
发表于: 2008-2-1 00:34 3613
-
==================问题一 IP多播=================
假定一个多播过程是这样的:1、告诉路由器我加上多播组234.5.6.7。2、向234.5.6.7发包。3、路由收到该包,把它发给所有加入234.5.6.7的机子,包括我(或者仅我)。
而现在的我情况是这样的:一台PC。电信宽带1M ADSL调制解调器。(主机箱那的网卡接口连到ADSL调制解调器,调制解调器连到......到哪我也不知道怎么说,到电信吧。)要上网就点开宽带连接。
现在的问题是:
1、当我断开宽带连接时(本地连接当然是一直连着的),上面的多播过程成功--尽管只有我一个多播成员。
请问:该多播过程中谁扮演了路由器的角色?
2、当我连上宽带连接时。此时多播过程失败了。向234.5.6.7发包(套接字设置IP_ADD_MEMBERSHIP选项,然后sendto()函数发UDP包),然后发生了什么情况以至于我没有收到多播包?
顺便问另一个问题:连上宽带连接后,我cmd里ipconfig/all后,本地连接和宽带连接里各有一个MAC,记作M1、M2。而我看了一下我的猫(就是那个ADSL调制解调器)上面生产厂家标的MAC,记作M3。M1、M2、M3各不相同。为什么不同?M1是我主板上的网卡MAC是吧?M2、M3是哪的呢?
==================问题二 校验和=================
发送ICMP报文时,必须自己计算校验和,将它填入ICMP头部对应的域中。校验和的计算方法是:将数据以字(字?靠,其实是汉字拉,2字节)为单位累加到一个双字(4字节)中,如果数据长度(字节数)为基数,最后一个字节将被扩展到双字(4字节),累加的最终结果是一个双字(4字节),最后将这个双字的高16bit和低16bit相加后取反,便得到了校验和。代码如下:
USHORT checksum(USHORT* buff, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buff++;
size -= sizeof(USHORT);
}
// 是奇数
if(size)
{
cksum += *(UCHAR*)buff;
}
// 将32位的chsum高16位和低16位相加,然后取反
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16); // ??? 这一步是干什么的?不懂嘞 请教~
return (USHORT)(~cksum);
}
假定一个多播过程是这样的:1、告诉路由器我加上多播组234.5.6.7。2、向234.5.6.7发包。3、路由收到该包,把它发给所有加入234.5.6.7的机子,包括我(或者仅我)。
而现在的我情况是这样的:一台PC。电信宽带1M ADSL调制解调器。(主机箱那的网卡接口连到ADSL调制解调器,调制解调器连到......到哪我也不知道怎么说,到电信吧。)要上网就点开宽带连接。
现在的问题是:
1、当我断开宽带连接时(本地连接当然是一直连着的),上面的多播过程成功--尽管只有我一个多播成员。
请问:该多播过程中谁扮演了路由器的角色?
2、当我连上宽带连接时。此时多播过程失败了。向234.5.6.7发包(套接字设置IP_ADD_MEMBERSHIP选项,然后sendto()函数发UDP包),然后发生了什么情况以至于我没有收到多播包?
顺便问另一个问题:连上宽带连接后,我cmd里ipconfig/all后,本地连接和宽带连接里各有一个MAC,记作M1、M2。而我看了一下我的猫(就是那个ADSL调制解调器)上面生产厂家标的MAC,记作M3。M1、M2、M3各不相同。为什么不同?M1是我主板上的网卡MAC是吧?M2、M3是哪的呢?
==================问题二 校验和=================
发送ICMP报文时,必须自己计算校验和,将它填入ICMP头部对应的域中。校验和的计算方法是:将数据以字(字?靠,其实是汉字拉,2字节)为单位累加到一个双字(4字节)中,如果数据长度(字节数)为基数,最后一个字节将被扩展到双字(4字节),累加的最终结果是一个双字(4字节),最后将这个双字的高16bit和低16bit相加后取反,便得到了校验和。代码如下:
USHORT checksum(USHORT* buff, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buff++;
size -= sizeof(USHORT);
}
// 是奇数
if(size)
{
cksum += *(UCHAR*)buff;
}
// 将32位的chsum高16位和低16位相加,然后取反
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16); // ??? 这一步是干什么的?不懂嘞 请教~
return (USHORT)(~cksum);
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
赞赏
雪币:
留言: