linux socket 程序被ctrl+c或者异常终止,再次起程序时提示该端口号已被绑定bind err:: Address already in use
原因
在服务端终止之后,会有一个TIME_WAIT的状态,持续2-4分钟,再次打开会出现绑定bind失败
解决方法
在bind函数前增加以下代码:
int mw_optval = 1;
setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&mw_optval,sizeof(mw_optval));
服务器端可以尽可能的使用SO_REUSEADDR(在绑定之前尽可能调用setsockopt来设置SO_REUSEADDR)套接字选项,这样就可以使得不必等待TIME_WAIT状态就可以重启服务器了,也就是说:TIME_WAIT状态还是存在的,但是不影响我们重新启动服务器
附:
CTRL+C:发送SIGINT信号给前台进程组中的所有进程。常用于终止正在运行的程序,强制中断程序的执行
CTRL+Z:发送SIGTSTP信号给前台进程组中的所有进程,常用于挂起一个进程,是将任务中断,但是此任务并没有结束,它仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行
bind:address already in use
还是一直存在(即使我们等了好长时间),其实这个很简单,那只是因为我们在退出服务端或者客户端的时候,我们是用了 CTRL +
Z,这个退出条件,跟CTRL+C搞混了!!!