资讯专栏INFORMATION COLUMN

UNIX 网络编程 chapter 7 (useless)

eccozhou / 2922人阅读

摘要:作用将服务器关闭后,实际上关闭了服务器的监听套接字,如果此时用户点击开启服务器,那么用户希望的情况是服务器又立即启动了。即使是第一次获得的套接字不需要重用,也要启用该选项,这样后面每次启用才会达到预期效果。

7.5.11 SO_REUSEADDR & SO_REUSEPORT SO_REUSEADDR

作用1
  当没有设置SO_REUSEADDR的时候,socketA先绑定到0.0.0.0:21,然后socketB绑定到192.168.0.1:21的时候将会失败(EADDRINUSE错误),因为0.0.0.0意味着"任意本地IP地址”,也就是"所有本地IP地址“,因此包括192.168.0.1在内的所有IP地址都被认为是已经使用了。但是在设置SO_REUSEADDR之后socketB的绑定将会成功,因为0.0.0.0和192.168.0.1事实上不是同一个IP地址,一个是代表所有地址的通配地址,另一个是一个具体的地址。注意上面的表述对于socketA和socketB的绑定顺序是无关的,没有设置SO_REUSEADDR,它们将失败,设置了SO_REUSEADDR,它将成功。

作用2
  将服务器关闭后,实际上关闭了服务器的监听套接字(close),如果此时用户点击开启服务器,那么用户希望的情况是服务器又立即启动了。由于close后,执行了主动关闭,执行主动关闭的一端,在客户执行被动关闭之后会经历TIME_WAIT状态,如上图。TIME_WAIT的时间为1-4分钟不等,当某端口处于TIME_WAIT状态时,是无法被绑定的(bind).如果在项目中用户关闭服务器后,希望立即启动,而程序却要等1-4分钟不等的时间后才能重新启动服务器明显不是我们所希望的。SO_REUSEADDR套接字选项就可以用来解决这个问题,实现瞬间重启服务器.
注意
  SO_REUSEADDR需要在每次socket和bind前调用,“每次”也就是说,不能再想要重用的那一次,对通过socket新获取的套接字启用,例如socket->bind->close进入TIME_WAIT,而此时想要在TIME_WAIT状态下绑定,那么接下来sock->setsockopt->bind,bind是不会成功的,或者只以为绑定的是同一个地址,就只第一次启用一次,也是不行的。即使是第一次获得的套接字不需要重用,也要启用该选项,这样后面每次启用才会达到预期效果。

SO_REUSEPORT

  SO_REUSEPORT的含义与绝大部分人对SO_REUSEADDR的理解一样。基本上说来,SO_REUSEPORT允许你将多个socket绑定到相同的地址和端口, 只要它们在绑定之前都设置了SO_REUSEPORT。如果第一个绑定某个地址和端口的socket没有设置SO_REUSEPORT,那么其他的socket无论有没有设置SO_REUSEPORT都无法绑定到该地址和端口直到第一个socket释放了绑定。
  SO_REUSEPORT并不表示SO_REUSEADDR。这意味着如果一个socket在绑定时没有设置SO_REUSEPORT,那么同预期的一样,其它的socket对相同地址和端口的绑定会失败,但是如果绑定相同地址和端口的socket正处在TIME_WAIT状态,新的绑定也会失败。当有个socket绑定后处在TIME_WAIT状态(释放时)时,为了使得其它socket绑定相同地址和端口能够成功,需要设置SO_REUSEADDR或者在这两个socket上都设置SO_REUSEPORT。当然,在socket上同时设置SO_REUSEPORT和SO_REUSEADDR也是可行的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38554.html

相关文章

  • 一起学并发编程 - 钩子函数(shutdownHook)

    摘要:在退出时执行必要的挽救措施。在这种情况下,一旦被提供,等待一个进程终止指定的时间。如果进程在该时间限制内没有终止,则通过发出或中的对等方强制终止进程。所以有可能这是在中途执行时发生的。 shutdownHook是一种特殊的结构,它允许开发人员插入JVM关闭时执行的一段代码。这种情况在我们需要做特殊清理操作的情况下很有用 用途 在Jboss,Jetty等容器中都可以看到shutdown...

    qpal 评论0 收藏0
  • [原创][连载]nim与python的异同3

    摘要:变量常量绑定无特定关键字直接设值将一个文字列放到名为的变量里的类型由文字列上面定义的正则表达式变成了整数这里就带来一个在大工程里很容易带来困扰的问题理解代码不得不受制于类型极易变的变量要理解代码所必需的工作量极大可变变量前缀将变量与 变量(常量)绑定 python无特定关键字,直接设值a = r^s*(d{4}-d{2}-d{2})s{1,2}(.+)$ # 将一个文字列放到名为a的...

    GraphQuery 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<