在为套接字编程时,我对使用 setsocketopt()产生了疑问。如果我们提供
setsockopt( socket_no, SOL_SOCKET,SO_REUSEADDR , (char *) &optval, (socklength) sizeof( optval ) );//To reuse addr
后面是同一个套接字的另一个套接字选项,
setsockopt( socket_no, IPPROTO_IPV6,IPV6_V6ONLY , (char *) &optval, (socklength) sizeof( optval ) );//To use only IPv6
(1)是否再次设置套接字选项,删除已设置的重用地址选项?
在少数情况下,需要立即关闭并重新打开静态端口。
(2)关闭并重新打开端口会立即导致问题吗?
(3)如果关闭并重新打开端口会立即导致问题,可以使用套接字选项中的SO_REUSEPORT / SO_REUSEADDR来避免。因为它克服了TCP协议设置的time_wait。或者有其他方法可以解决这个问题吗?
答案 0 :(得分:1)
(1)是否再次设置套接字选项,删除已设置的重用地址选项?
没有。每个套接字选项都是独立的。
(2)关闭并重新打开端口会立即导致问题吗?
不,除非最近与该端口至少有一个TCP连接。
(3)如果关闭并重新打开端口会立即导致问题,可以使用套接字选项中的SO_REUSEPORT / SO_REUSEADDR来避免。因为它克服了TCP协议设置的time_wait。或者有其他方法可以解决这个问题吗?
它对time_wait没有影响。它只是让你立即重新打开端口。现有连接不受影响,并且通常会继续超时,这不会阻止您重新打开端口。