问一个原始套接字发包自动加上了ip头的有关问题
问一个原始套接字发包自动加上了ip头的问题
才接触原始套接字不久 我想要模拟tcp协议的连接建立
现在还在发送syn包 但是遇到一些问题
抓包呈现效果如下:

灰色部分是自己加上的的ip头 而我红色框里面自己的ip头却被当成了数据 这是这么回事?
而且出去的数据抓包工具也没有解析出是syn数据包显示的就只是ipv4
不是setsockeopt里面设置了 自己定义头数据吗?为什么 他自己还加上了头而且我也试过把socket(AF_INET,SOCK_RAW,IPPROTO_IP);后面换成TCP但是 这样的话数据都发送失败 获取错误码是10075翻译过来好像是 发送数据前必须先调用connect建立好连接
我也对照了数据 没有发现什么问题 有问题也应该是ip头和tcp头里面的校验和 但是那个值是调用网上抄写的代码的:
其他数据我都对比过了 没有错
然后我干脆直接 用正常方式连接一次 然后再把那个正常发送出去了的syn包数据 抓去下来自己用原始套接字再发送一次 还是不行:
所以就来求助了 开始我觉得 不就是socket发一个包出去嘛 感觉很简单的事情 结果搞了半天都没有自己想要的结果
求指教啊。。
------解决思路----------------------
一是你看看你发的数据包对不对,不对的话,wireshark也过滤不到;二是你可以在对端抓包看看包有没有发到对方。
------解决思路----------------------
Win7好象不支持SOCK_RAW了。
才接触原始套接字不久 我想要模拟tcp协议的连接建立
现在还在发送syn包 但是遇到一些问题
socket定义如下(伪代码):
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, true);
//第一种发送方式
connect(sock,destAddr);
send(sockClient,sendBuf,dataSize);
//第二种-------------------------------------------------
sendto(sock, sendBuf, dataSize, destAddr);
抓包呈现效果如下:
灰色部分是自己加上的的ip头 而我红色框里面自己的ip头却被当成了数据 这是这么回事?
而且出去的数据抓包工具也没有解析出是syn数据包显示的就只是ipv4
不是setsockeopt里面设置了 自己定义头数据吗?为什么 他自己还加上了头而且我也试过把socket(AF_INET,SOCK_RAW,IPPROTO_IP);后面换成TCP但是 这样的话数据都发送失败 获取错误码是10075翻译过来好像是 发送数据前必须先调用connect建立好连接
我也对照了数据 没有发现什么问题 有问题也应该是ip头和tcp头里面的校验和 但是那个值是调用网上抄写的代码的:
//计算检验和函数,完全抄别人的
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);
}
其他数据我都对比过了 没有错
然后我干脆直接 用正常方式连接一次 然后再把那个正常发送出去了的syn包数据 抓去下来自己用原始套接字再发送一次 还是不行:
//后来干脆抓去一个能正常发送的数据包自己在用原始套接字发送一次 效果一样
sendBuf =[]{
0x45,0x00,0x00,0x34,0x20,0x49,0x40,0x00,0x80,0x06,0x50,0x05,0xac,0x10,0x08,0x98,
0xb4,0x61,0x21,0x6c,0x56,0x11,0x00,0x15,0x98,0x47,0x67,0x6a,0x00,0x00,0x00,0x00,
0x80,0x02,0x20,0x00,0x6e,0xc8,0x00,0x00,0x02,0x04,0x05,0xb4,0x01,0x03,0x03,0x02,
0x01,0x01,0x04,0x02
};
所以就来求助了 开始我觉得 不就是socket发一个包出去嘛 感觉很简单的事情 结果搞了半天都没有自己想要的结果
求指教啊。。
------解决思路----------------------
一是你看看你发的数据包对不对,不对的话,wireshark也过滤不到;二是你可以在对端抓包看看包有没有发到对方。
------解决思路----------------------
Win7好象不支持SOCK_RAW了。