初学socket编程,好容易调好一个双向tcp的简单通信,一直有些不舒服的是,当程序结束后,再次运行时
总会perror抛出Address already in use的问题
网上找了找资料,
bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。
等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。
int on=1;
if((setsockopt(fd_sock,SOL_SOCKET,
SO_REUSEADDR,&on,sizeof(on)))<0)
{
perror("setsockopt");
return(-1);
}
于是结合man手册,通过以上函数,使得端口可以立即重用