程序死亡时,Linux套接字释放得太慢

编辑:tl; dr:

不要打开错误的选项,这是不可能的工作!

原问题:

我正在使用一个没有干净closures机制的程序,它只是依靠被杀死来终止它。

它打开一个套接字如下:

(void) setsockopt(h, SOL_SOCKET, (SO_KEEPALIVE | SO_REUSEADDR), (int *) & optval, sizeof( optval )); 

重用地址选项似乎工作, 最终套接字在程序死后被释放。 最终是从几秒到最后一分钟。

这是非常繁琐的,因为我需要定期重启这个程序。 让程序正确地分配是一个非常大的工作,但是我想知道是否有更多的本地我可以做更早释放套接字?

套接字选项不是位,因此不能像SO_KEEPALIVE | SO_REUSEADDR那样变成SO_KEEPALIVE | SO_REUSEADDR SO_KEEPALIVE | SO_REUSEADDR 。 要迂腐, SO_KEEPALIVE | SO_REUSEADDR SO_KEEPALIVE | SO_REUSEADDR产生另一个套接字选项SO_NO_CHECK

你不会注意到这个错误,因为你不检查setsockopt的返回值。 现在你知道为什么忽略返回值被认为是不好的做法。