我使用 Ctrl-C 终止服务器,我认为这会立即关闭套接字。但是事实证明,如果我绑定(bind)同一个端口,它会说绑定(bind)失败。我使用 mac OS X。有什么想法吗?我什至为 ctrl C 实现了信号处理程序来关闭它,但仍然有同样的问题。
最佳答案
你可以在绑定(bind)它之前用它来消除错误(至少在 Linux 上,我不知道 OSX)
int on = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, on.sizeof); // or sizeof(on) in C
当套接字关闭时,内核会保留一个句柄,以防线路上仍有一些未决数据以乱序或延迟等方式到达,因此它可以在数据到达时通过告诉另一端它来理智地处理它现在关闭,而不是将那些随机 block 传送到下一个应用程序。如果您想了解更多信息,这称为“time_wait”状态。在发布所有内容之前需要几分钟,以确保一切都清楚。
这个 reuse addr 选项告诉它不用担心这个,只要重新绑定(bind)就不用等待了。
关于c - Linux 套接字 : Close socket in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22138576/