bind绑定端口之后,accept还在阻塞等待连接,这时如果另一个线程close(fd),此时的fd并没有解绑,该端口还是处于监听状态;导致其他线程绑定该端口时失败;要解决该问题,需要将accept函数改为非阻塞等待,并通过一个标志位来判断是否继续accept;
while (1)
{
FD_SET(p_session->sockfd, &rset);
ret_val = select(p_session->sockfd + 1, &rset, NULL, NULL, &accept_timeout);
if (ret_val > 0 && FD_ISSET(p_session->sockfd, &rset))
{
p_session->connfd = socket_accept(p_session->sockfd, &p_session->addr_client);
if (p_session->connfd < 0)
{
PRT_ERR("socket_accept faield, try again...\n");
continue;
}
else
{
PRT_DBG("socket_accept success, keepalive:%s\n", p_session->susp_param.keepalive);
break; // accept成功退出while(1)循环
}
}
if (!p_session->b_on_flying)
{
return;
}
}