在使用TCP连接方式的时候,当一个绑定到指定端口的描述符主动断开时,在这个端口上的连接将进入TIME_WAIT状态,并且会等待2*MSL时间才释放。如果在这个时间内,需要再次绑定相同的指定的端口,就需要设置描述符的SO_REUSEADDR属性,否则绑定会失败。
char rep = 1;
setsockopt( skt, SOL_SOCKET, SO_REUSEADDR, &rep, sizeof(rep) );
这样设置后,就可以在释放后立刻重新绑定相同指定端口。
但这段程序搬到linux平台则运行不正常,setsockopt的时候返回值为-1出错,在网上搜了一下,发现时这个rep参数的类型不对。修改程序如下:
int rep = 1;
setsockopt( skt, SOL_SOCKET, SO_REUSEADDR, &rep, sizeof(rep) );
这样在linux平台下运行也就正确了。
具体为什么需要rep定义为一个int类型,目前还没有深入去理解,但我猜测,在linux平台下,socket层他需要去判断一个四字节的参数,而如果只是传递了一个单字节参数,那么很可能判断不正确,设置属性就会异常。
需要求证。