我开发了一个包含tcp服务器的服务。
当我重新启动应用程序时,有时我的应用程序无法为TIME_WAIT原因绑定端口。
在我的应用程序中,我想在绑定失败时添加一个过程。这个过程应该在开始时检查绑定的类型是否失败:
TIME_WAIT
,那么等待amoment和
再试一次。我怎么知道绑定的类型失败?
注意:
SO_REUSEADDR
errno
对于两种类型的失败都是相同的答案 0 :(得分:2)
首先,我会在你的侦听套接字上使用SO_REUSEADDR
sockopt来避免这种情况。 SO_REUSEADDR
将允许您在重新启动时重用TCP服务器之前使用的相同套接字,因为它仍然由操作系统保持打开状态。
其次,错误处理总是一个好主意。我建议您检查bind
的返回值,并处理您希望遇到的最可能的errno
。您可以在手册页的第2部分中获取errno
的{{1}}列表。
bind
最后,$> man -s 2 bind
中套接字的errno
与正在使用的地址TIME_WAIT
相同:errno
。这是因为操作系统正在使用EADDRINUSE
中的套接字。
答案 1 :(得分:-1)
您可以查看并等待以下代码。
var="$(netstat -ant|grep <portnumber>|awk '{print$6}')"
if [ "$var" == "TIME_WAIT" ] ;then
sleep 5