服务器有时可以立即重启,有时候无法立即重启 — bind error
首先要知道:四次挥手动作完成之后,主动断开连接的一方要维持一段时间的TIME_WAIT
bind error原因:因为是服务器主动断开的,所以服务器要去维持TIME_WAIT状态,维持该状态期间,该端口依旧被占用,所以就无法绑定成功
解决方案:使用setsockopt() 设置地址复用
void initServer()
{
// 1.1创建socket文件套接字对象
_listensock = socket(AF_INET, SOCK_STREAM, 0);
if (_listensock < 0)
{
exit(SOCKET_ERR);
}
// 1.2设置地址复用
int opt = 1;
setsockopt(_listensock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// 2.bind绑定自己的网络信息
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(_port);
local.sin_addr.s_addr = INADDR_ANY;
if (bind(_listensock, (struct sockaddr *)&local, sizeof(local)) < 0)
{
exit(BIND_ERR);
}
// 3.设置socket 为监听状态
if (listen(_listensock, gbacklog) < 0) // listen第二个参数以后在讲
{
exit(LISTEN_ERR);
}
}