原始套接字:我应该如何定义TCP标志(记住字节顺序)以及何时使用hton函数?

时间:2011-04-05 19:28:52

标签: sockets endianness

我阅读了一篇关于如何创建自己的IP和TCP标头并使用原始套接字发送它们的教程(http://mixter.void.ru/rawip.html)。我有两个与OS字节顺序有关的疑问。我在Intel x86上使用Linux。

首先,如何定义TCP标志?

#define TCP_URG 1
#define TCP_ACK 2
#define TCP_PSH 4
#define TCP_RST 8
#define TCP_SYN 16
#define TCP_FIN 32

或者

#define TCP_URG 32
#define TCP_ACK 16
#define TCP_PSH 8
#define TCP_RST 4
#define TCP_SYN 2
#define TCP_FIN 1

同一教程的另一个疑问是,在创建ip和tcp标头时,某些字段将转换为网络字节顺序,然后存储在标题中,而其他字段按原样存储。 e.g。

iph->ip_ttl = 255;

 iph->ip_id = htonl (54321);

为什么会这样?

已编辑:当我尝试在我的计算机上运行此ip欺骗程序时,sendto将返回错误“权限被拒绝”(尽管我以超级用户身份运行它)。为什么会发生这种情况以及如何纠正它?

1 个答案:

答案 0 :(得分:0)

ip_ttl字段只有一个字节,因此字节顺序不相关。另一方面,ip_id是16位,所以这里的字节顺序是相关的。

由于分配给ip_ttl的值将被截断为第一个字节,因此您不应在其上使用htons / htonl,因为宏会隐式地将您的整数提升为更大类型和您感兴趣的字节可能会被截断。

你的第一组标志是对的。