int getsockopt (int sockfd, int level, int name, char* value, int* optlen);
int setsockopt (int sockfd, int level, int name, char* value, int* optlen);
参数:
sockfd : 必须是一个已经打开的套接字
level : 是函数所使用的协议标准(protocol level) (TCP/IP 协议使用 IPPROTO_TCP, 套接字标准的选项使用 SOL_SOCKET)。
name :
value : 指向为 getsockopt()函数所获取的值。 setsockopt 所设置的值的地址。
linux 系统所提供的socket库有一个bug,次错误表现为你不能为一个套接字重新启用一个端口号,即使在你正常关闭一个套接字以后。例如,你编写一个服务器在套接字上等待的一个程序,服务器打开套接字,并在其上侦听,是没有问题的,无论如何,总有一些原因,使你的程序需要重新启动,然后重新启动后,就不能把它绑定在原来的那个端口上了,从bind 系统调用返回代码总是说你试图连接的端口已经被别的进程所绑定。问题在于linux内核在一个绑定套接字的进程结束后,从不把端口标记为未用,解决这个问题的办法是,当套接字打开,但尚未有连接的时候,用setsockopt系统调用,设定如下选项
当打开一个socket套接字的时候,必须同时用下面的代码段来调用setsockopt 函数
int opt = 1;
int len = sizeof(opt)
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, &len)
SO_REUSEADDR 选项将套接口设置成重新使用旧的地址(ip和port),而不等待