套接字类型之间的区别

4

是的,我已经尝试查找关于此问题的信息。

Python套接字文档中列出了我认为是协议的列表:

SO_*
socket.SOMAXCONN
MSG_*
SOL_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*

他们具体做什么?假设我使用了
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

这是什么?我知道它是一个原始套接字,但是IPPROTO_IP是否意味着我必须构造所有内容?(例如IP头部到TCP再到数据?)

Python文档说我可以在Unix套接字文档中找到上述信息,但我找不到该文档。有人知道在哪里吗?


是的,IPPROTO_IP意味着原始IP,你可能不需要它。(虽然你只需要构造TCP头部而不是IP头部。)至于文档,请尝试访问http://linux.die.net/man/7/socket。 - Sneftel
谢谢,非常感谢。所以只是为了确保,如果我使用(IPPROTO_IP),这意味着任何协议都必须由我构建?因此,如果我正在使用TCP,则需要构建TCP头,UDP等...? - user3842825
没错。此外,对于TCP,您必须实现自己的握手、确认、重传等功能。 - Sneftel
1个回答

8

有许多Linux手册页面描述套接字:

通常,我们使用以下参数用于socket

  1. 地址族:互联网地址族使用AF_INET,UNIX地址族使用AF_UNIX

  2. 套接字类型:TCP使用SOCK_STREAM,UDP使用SOCK_DGRAM。当然,您也可以使用SOCK_RAW直接访问IP协议。

  3. 协议:使用TCP或UDP时,将其保留为0即可;使用RAW时,可以指定协议为0,对于TCP sockets使用IPPROTO_TCP,对于UDP sockets使用IPPROTO_UDP。

SO_表示“套接字选项”,SOL_表示“套接字选项级别”,用于通过setsockopt设置套接字选项(在SOCKET中也提到)。

实际上,您可以在这些页面底部的“参见”部分找到更多页面。请注意,第2或3页是具体的系统调用或库函数,第7页是您需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接