我正面临绑定到套接字的这个问题。 第1实例正常工作,即 socket()返回成功,因此返回bind()和listen(),accept(),因此recv() - 直到这里都很好。 绑定“地址已在使用”
时出现第二个实例抛出错误我在此之前已经完成了所有帖子,我没有看到同样提供的具体解决方案。
我的代码如下: -
if((status = getaddrinfo(NULL,"8080",&hints,&servinfo))!=0){
ALOGE("Socket:: getaddrinfo failed %s\n",strerror(errno));
return NULL;
}
server_sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
if(server_sockfd == -1) {
ALOGE("Socket:: Scoket System Call failed %s\n",strerror(errno));
return NULL;
}
if ((setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int))) < 0)
{
ALOGE("Socket:: setsockopt failed %s\n",strerror(errno));
return NULL;
}
ret = bind(server_sockfd, servinfo->ai_addr,servinfo->ai_addrlen);
if(ret!=0) {
ALOGE("Socket:: Error Binding on socket %s\n",strerror(errno));
return NULL;
}
此代码在android平台上运行。
我在打开新会话之前已正确关闭每个会话,如下所示: -
ret = shutdown(client_sockfd,0);
if(ret != 0)
ALOGE("Socket:: Shutdown Called%s\n",strerror(errno));
我也尝试过关闭,但它没有用。
令人惊讶的是,即使我们尝试长时间打开套接字(根据TIME_WAIT逻辑),错误也不会消失
有人可以指导我正确调用或API或逻辑(代码而不是命令行,除了直接杀死进程)来处理这种情况吗?
答案 0 :(得分:1)
套接字是通过特定端口上的网络在两台计算机之间进行通信的一半通道。 (另一半是另一台计算机上相应的套接字)
在这种情况下,我想错误非常清楚。如前所述Address already in use
,所以你在第二次尝试中尝试连接的套接字已经被使用(端口已被占用) - &gt;可能是由于第一个插座连接。
要进一步调查,请检查另一个SO question here和here
答案 1 :(得分:0)
即使使用SO_REUSEADDR,您也无法在两个进程之间共享TCP侦听端口。
NB shutdown()
未关闭TCP会话。它半闭。你必须关闭套接字。