应在原Socket还是新连接Socket上设置套接字选项?
套接字选项设置位置说明
要确定在哪个套接字上调用setsockopt,得先明确监听套接字s和连接套接字conn的分工:s仅负责监听和接受新连接,不参与实际的数据收发;conn是与客户端建立的实际TCP连接,用于数据传输。
1. TCP_NODELAY(IPPROTO_TCP层级)
这个选项用于禁用Nagle算法,直接影响TCP连接的数据发送策略。由于监听套接字s本身没有建立TCP连接,该选项只能设置在conn上——每次调用accept()获取新连接后,对conn执行设置:
conn, addr = s.accept() conn.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) connections.append(conn)
2. SO_SNDBUF(SOL_SOCKET层级)
这个选项用于设置套接字的发送缓冲区大小,有两种设置方式:
- 全局生效:在监听套接字
s上设置(需在bind()之后、listen()之前执行),后续所有通过s.accept()创建的新连接conn都会继承这个缓冲区大小:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('0.0.0.0', 9999)) s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2048) s.listen() - 单个连接生效:在
accept()返回的conn上设置,仅影响当前这个TCP连接的缓冲区:conn, addr = s.accept() conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2048) connections.append(conn)
总结
TCP_NODELAY:必须设置在新连接套接字conn上SO_SNDBUF:根据需求选择设置在监听套接字s(所有新连接共享)或连接套接字conn(仅当前连接生效)
内容的提问来源于stack exchange,提问作者firion
相关产品推荐
相关产品推荐

