我使用Ctrl终止服务器,我认为它将立即关闭套接字。然而,如果我绑定相同的端口,它会说绑定失败。我使用mac,有什么想法吗?我甚至为ctrl C实现了信号处理程序来关闭它,但是仍然存在相同的问题。
发布于 2014-03-02 20:21:20
在绑定之前,您可以消除这个错误(至少在Linux上,我不知道OSX)。
int on = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, on.sizeof); // or sizeof(on) in C
当套接字关闭时,内核会保留一个句柄,以防线路上仍有一些未处理的数据到达故障或延迟,所以当它到达时,它可以理智地处理它,方法是告诉另一方它现在已经关闭,而不是将这些随机块传递给下一个应用程序。这就是所谓的"time_wait“状态,如果你想了解更多。在发布所有内容之前,需要几分钟才能确保它是清晰的。
这个重用addr选项告诉它不要担心这一点,只是在没有等待时间的情况下重新绑定。
发布于 2014-03-02 20:19:55
您可以在创建套接字时使用SO_REUSEADDR
标志。从手册页:
指示用于验证bind(2)调用中提供的地址的规则应允许本地地址的重用。对于AF_INET套接字,这意味着套接字可以绑定,除非有一个活动侦听套接字绑定到该地址。当侦听套接字绑定到具有特定端口的INADDR_ANY时,就不可能绑定到该端口以获取任何本地地址。参数是整数布尔标志。
这样,只要您重新启动程序,并且没有活动套接字绑定,就可以重新绑定.
您还可以在套接字创建后(但在执行bind
之前)使用setsockopt
设置此标志。见Adam's answer。
https://stackoverflow.com/questions/22138576
复制