读书人

通过setsockopt设置TOS不能对TCP三次握

发布时间: 2012-03-03 15:33:02 作者: rapoo

通过setsockopt设置TOS不能对TCP三次握手数据包生效?
代码很简单:
SOCKET s=socket(AF_INET,SOCK_STREAM, 0);

int tos=20;
setsockopt(s, IPPROTO_IP, IP_TOS, (char*)&tos, sizeof(tos)) ;

struct sockaddr_in Addr;
ZeroMemory(&Addr,sizeof(sockaddr_in));
Addr.sin_family = AF_INET;
Addr.sin_port = htons(80);
Addr.sin_addr.s_addr = inet_addr("X.X.X.X");

connect(s,(sockaddr*)&Addr,sizeof(sockaddr_in));
send(s,"1234567890",10,0);
...

其中每个函数的返回值都正确,通过实际抓包观察,每次TCP三次握手的数据包都没有设置TOS置,即还是默认的0。
但是send函数发出的包的TOS值就是设置的20。(有时候send函数发出的包也没有设置上tos,但随后发的一两个数据包还是TOS又被标识上了)
而且一旦TOS被设置上,该SOCKET对应的连接数据包的TOS都能生效。
最早以为是setsockopt(s, IPPROTO_IP, IP_TOS, (char*)&tos, sizeof(tos))这句话需要一定的时间才能生效,但事实是setsockopt与connect函数之间无论等待多久,情况依旧。
另外,如果创建的是一个UDP的SOCKET.那就完全正确,发出的第一个数据包的TOS都是被设置上了的。

现在的问题是,如果想标记TCP三次握手数据包里的TOS字段还有什么办法?
NDIS我会,但现在这个应用暂不适合哈,所以大家就不用提NDIS了


[解决办法]
http://dotnethome.spaces.live.com/blog/cns!76C33803D3304A1C!395.entry
[解决办法]
没研究过这个问题
[解决办法]
"在 Windows NT 4.0 和 Windows 9x x Winsock 应用程序可以通过调用带有 IP_TOS 选项 setsockopt 函数为 UDP 和 $ ICMP 数据包的 IP 报头中设置 ToS 位。在这些平台上的 ping 实用程序还允许使用 ICMP 回送数据包中将标记 ToS 位,"-v"选项。请注意将标记为 TCP 数据包,ToS 位从未像现在可用于 Winsock 甚至虽然 IP_TOS 上使用选项 TCP 套接字 setsockopt 调用返回 0 (成功)。

在 Windows 2000,Windows XP 和 Windows Server 2003 上, ToS 位标记 Winsock 应用程序中的功能和 ping 实用程序在默认情况下被禁用。尝试在这些版本的 Windows 上设置 IP_TOS 选项以及 setsockopt 函数仍返回 0 (成功),使应用程序可以继续运行 ; 但未标记 ToS 位 IP 标头中。 "

具体请看以下微软的连接:
http://support.microsoft.com/kb/248611

读书人网 >VC/MFC

热点推荐