套接字类型的区别

4 投票
1 回答
3846 浏览
提问于 2025-04-18 13:28

是的,我已经尝试过寻找相关的信息。

Python的socket文档里有一份我认为是协议的列表:

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)

这到底是做什么的?我知道这是一个原始socket,但IPPROTO_IP是不是意味着我得自己构建所有东西?(也就是说,从IP头到TCP再到数据?)

Python的文档说我可以在Unix的socket文档中找到关于上述内容的信息,但我找不到那个文档。有人知道在哪里吗?

1 个回答

8

有很多关于套接字的Linux手册页面:

一般来说,我们在使用socket的时候会用到这些参数:

  1. 地址族:AF_INET表示互联网地址族,AF_UNIX表示UNIX地址族。

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

  3. 协议:使用TCP或UDP时,协议参数可以设为0;如果使用原始套接字,可以指定协议为0,TCP套接字用IPPROTO_TCP,UDP套接字用IPPROTO_UDP。

另外,SO_表示“套接字选项”,SOL_表示“套接字选项级别”,这些都是通过setsockopt来设置套接字选项的(在SOCKET中也提到过)。

实际上,你可以在这些页面的底部找到更多的页面,查看SEE ALSO部分。注意,2或3号页面是具体的系统调用或库函数,而7号页面是你需要的内容。

撰写回答