V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
coolair
V2EX  ›  问与答

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

  •  
  •   coolair · 2016-07-29 17:48:39 +08:00 · 1519 次点击
    这是一个创建于 3031 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下:

    书上说第 12 行,不设置 SO_REUSEADDR 时,如果在某个端口上运行一个 Python 套接字服务器,连接一次之后便终止运行,就不能再使用这个端口了。
    我在 Windows 下测试,并没有这个问题啊?

    我是按如下方法测试的:
    1 )先 python abc.py ,启动服务端。
    2 ) telnet 127.0.0.1 8282 ,连接服务端。
    3 )到 1 )的终端按 Ctrl+C 。
    4 )在新的终端运行 python abc.py 。
    其中,并没有报错啊?!
    是我哪里操作不对么?还是这个选项在不同的操作系统上效果不一样?
    3 条回复    2016-07-29 21:23:25 +08:00
    coolair
        1
    coolair  
    OP
       2016-07-29 19:10:47 +08:00
    有人指导下么?!
    ryd994
        2
    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
        3
    coolair  
    OP
       2016-07-29 21:23:25 +08:00 via Android
    @ryd994 非常感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2871 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:42 · PVG 11:42 · LAX 19:42 · JFK 22:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.