python 网络编程 SO_REUSEADDR 没用是怎么回事?

2016-07-29 17:48:39 +08:00
 coolair
代码如下:
https://gist.github.com/anonymous/94ad638007c6690643f6897b2fa5a41d
书上说第 12 行,不设置 SO_REUSEADDR 时,如果在某个端口上运行一个 Python 套接字服务器,连接一次之后便终止运行,就不能再使用这个端口了。
我在 Windows 下测试,并没有这个问题啊?

我是按如下方法测试的:
1 )先 python abc.py ,启动服务端。
2 ) telnet 127.0.0.1 8282 ,连接服务端。
3 )到 1 )的终端按 Ctrl+C 。
4 )在新的终端运行 python abc.py
其中,并没有报错啊?!
是我哪里操作不对么?还是这个选项在不同的操作系统上效果不一样?
1489 次点击
所在节点    问与答
3 条回复
coolair
2016-07-29 19:10:47 +08:00
有人指导下么?!
ryd994
2016-07-29 20:51:42 +08:00
windows 下不要用这个选项
SO_REUSEADDR 在 windows 下和 linux 下含义不同

windows 下代表该端口被占用后,其他程序依然可以 bind 到这个端口。当两个 SO_REUSEADDR 的 socket 占用同一个端口时,行为是不确定的。 windows 下没有 TIME_WAIT 的问题。
linux 下代表即使另一个程序已经占用该端口,只要地址不同,依然可以 bind 。如果有 TIME_WAIT 的 socket ,也可以 bind (一般不可以)。

参考 http://stackoverflow.com/a/14388707

其实 linux 下也不是非要用这个选项,只要保证总是客户端主动关闭连接即可,因为只有服务端主动关闭连接时,服务端才存在 TIME_WAIT 占用端口的问题
coolair
2016-07-29 21:23:25 +08:00
@ryd994 非常感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/295839

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX