考虑一个完成的父进程,该进程socket/bind/accept
将在打开该套接字的情况下派生子进程以与之通信,而父进程继续接受连接。然后,该父进程被杀死。
现在,另一个进程尝试在同一端口上绑定到父进程绑定到的相同地址,但是收到EADDRINUSE错误。
但是,当你完成这个过程sshd
,这似乎sshd
是能够重新绑定到已关闭的端口,而重新启动窗口期间(其中sshd的父进程没有运行),不同的程序(运行为不同的用户)刚刚获得EADDRINUSE。
这背后的语义是什么?为什么可以sshd
重新绑定,但另一个用户进程却不能?
此外,我可以确认netstat -a | grep PORT
只有子进程正在运行时(其他进程无法运行bind
)的输出是,唯一的连接是ESTABLISHED
一个,没有连接LISTEN
。
尽管我不了解所有语义(我找错了地方,或者缺少文档),但我相信关闭连接后(可能由设置SO_LINGER
)一定时间后,任何进程都无法执行除非已SO_REUSEADDR
设置,否则请打开具有相同详细信息的新套接字。
据我所知,这是为了防止某人在连接关闭后重新连接,并且该进程必须处理原先用于该进程的数据包。
man 7 socket
没有记录这部分内容,SO_REUSEADDR
因此很难弄清楚这个答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句