根据Unix Network Programming Vol1的说法,“接收到的UDP包和TCP包永远不会传递到原始套接字。如果一个进程想要读取包含UDP或TCP包的IP数据包,则必须在数据链路层读取这些包”...
但与此相反的是,在创建原始套接字时有一个IPPROTO_TCP协议选项,在我看来,它就是为这个目的服务的。有人能指出我在理解这一点时可能犯的错误吗?
发布于 2011-03-30 02:30:05
创建原始套接字时,可以使用IPPROTO_TCP等协议选项指定要绑定到的协议。但是,此选项仅确定您打开的套接字的类型,因此在该端口上接收的数据将被转发到您的应用程序。因此,如果您设置IPPROTO_TCP并在端口5000上打开一个原始套接字,您的应用程序将接收发送到端口5000的原始TCP数据包,但不会接收发送到端口5000的原始UDP数据包。
即使包被保证是TCP的,套接字也不会做任何正常的TCP处理(syn、ack、重新排序等),您只会得到原始的IP包,其中包含代表TCP报头的二进制数据块。使用普通的TCP套接字,您接收的数据是嵌入在TCP标头中的数据。对于原始TCP套接字,数据仍然是嵌入在链路层报头中的所有内容,因此您将看到IP报头,然后是TCP报头,然后是接收到的每个数据包的有效负载数据。
有关更多信息,请查看此教程:
A brief programming tutorial in C for raw sockets
https://stackoverflow.com/questions/5476112
复制相似问题