raw socket的简单问题?! 小弟用raw socket截获ip包后,修改目标ip地址,然后再发送出去,发送的时候总是出错,我查了一下以前的贴子,可能是要修改校验和的原因,请问怎么修改呀?还要修改其他的东西么?哪位大虾有这方面的源代码么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要修改 checksum。是 TCP 的还是 UDP 的? RFC里面有个大众算法,我忘记在哪里了,应该是在说NAT的哪一篇 是TCP的,是哪个RFC呀,有源代码么? raw socket只能窃听数据包吧不能截获你重发一次tcp包有什么意义? unsigned short getChecksum( char* buf, int size ){ unsigned long cksum = 0l; unsigned short* data = (unsigned short*) buf; while( size >= sizeof(unsigned short) ) { cksum += *data; data++; size -= sizeof( unsigned short ); } if( size == 1 ) { cksum += *((unsigned char*)data); } cksum = (cksum >> 16) + (cksum & 0xFFFF); cksum += (cksum >> 16); return ((unsigned short)(~cksum));}在计算IP头的校验码时,首先要把校验码字段置为0,然后计算 USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while (size > 1) { cksum += *buffer++; size -= sizeof(USHORT); } if (size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } 我是想实现将发给机器A的ip包的目标ip地址修改为机器B的ip地址后,然后转发,请问机器B能收到么?(是TCP协议。) tcp是三次握手的,是握手包的话可以发送得到,例如syn洪水攻击就是这样了如果不是的话,你要算出那个序列号才可以让目标主机不丢弃这个数据包,算出这个序列号的话比较困难,有些牛人可以算得出,我算不出 这么说NAT只能实现UDP了,不能实现TCP,是不是这样理解的呀?小弟是新手。 1、注意IP的校验和和TCP的校验和计算2、既然你是做双向转发,注意分别针对两边的序号和确认号的连续性。3、选择方便的sniffer软件来调试,推荐iris,可以帮助你检查和计算校验和。 WinXPSP2下RAW_SOCKET的使用有很大的限制,只能用来发IP地址合法的UDP数据。参见Windows XP SP2文档 如何获得网络列表 Tab control上对话框里的控件如何增加快捷键? c/c++编写DLL求救 开机问题? COM Attribute的问题 ActiveX控件如何在它所在的IE窗体自动获得焦点的问题! 内存泄露问题 如何把listCtrl显示的内容分页打印出来? bios时间的简单问题,接触过的朋友请进 如何实现滚动视图中固定标题的显示 请教怎么才能只让特定用户才能关掉程序 用InstallShield打包程序以后,在wizard生成工程以后发觉工程名字有误,想改怎么才能改呢。
我忘记在哪里了,应该是在说NAT的哪一篇
不能截获
你重发一次tcp包有什么意义?
{
unsigned long cksum = 0l;
unsigned short* data = (unsigned short*) buf; while( size >= sizeof(unsigned short) )
{
cksum += *data;
data++;
size -= sizeof( unsigned short );
}
if( size == 1 )
{
cksum += *((unsigned char*)data);
} cksum = (cksum >> 16) + (cksum & 0xFFFF);
cksum += (cksum >> 16); return ((unsigned short)(~cksum));
}在计算IP头的校验码时,首先要把校验码字段置为0,然后计算
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
2、既然你是做双向转发,注意分别针对两边的序号和确认号的连续性。
3、选择方便的sniffer软件来调试,推荐iris,可以帮助你检查和计算校验和。