套接字错误::地址已被使用
我正面临绑定到套接字的这个问题。 第一个实例正常工作,即 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或逻辑(代码而不是命令的错误没有消失,甚至除了直接杀死进程之外)处理这种情况?
A socket is one half a channel of communication between two computers over a network on a particular port. (the other half is the corresponding socket on the other computer)
错误非常明显我想在这种情况下。正如所提到的Address already in use
,所以你试图在第二次尝试连接的套接字已经被使用(端口已被占用) - >也许是由于第一次套接字连接。
为了进一步研究验证其他SO question here和here
Thanks.Indeed错误是明确的,因为我提到。但我想重新使用相同的端口,我甚至无法在调用close(以及shutdown())之前尝试重新打开它。上述所有close()doe snot第一次返回任何错误。如果关闭失败,则close应该抛出错误,请求的fd无法关闭。保留我的查询。 – user5729621
@ user5729621您可以发布您关闭之前打开的套接字的代码片段吗? –
我已经发布了相同的内容。我的意思是我尝试了关闭Api和关闭Api,但接下来的绑定反复出现错误。此外,我已尝试与另一个端口号,但它抛出相同的错误 – user5729621
您不能共享,甚至与SO_REUSEADDR两个进程之间的TCP监听端口。
NB shutdown()
不会关闭TCP会话。它将其关闭一半。你必须关闭套接字。
该OP说:“*我试着靠近,但它没有奏效。*” –
@RemyLebeau确实。很难理解为什么他会为'shutdown()'困扰,为什么他最初不使用'close()'。 – EJP
你是(错误地)关闭一个接受的客户端套接字,但你是否也关闭了侦听服务器套接字?您不能将新的TCP套接字绑定到与先前套接字仍然绑定的IP /端口相同的IP /端口。你为什么试图将多个套接字绑定到同一个IP /端口? –
感谢您的意见。 是的,我在客户端和服务器套接字中调用close。 同样的逻辑是我的服务器线程是一个应用程序的一部分,它是基于成功启动我创建服务器线程的应用程序的一部分。即使在我的应用程序关闭后,此线程也不必不必要地处于活动状态。要处理此情况,我尝试了在调用pthread_exit时关闭套接字。 就客户而言,我认为可以在客户完成其工作时致电关闭。 如果我的逻辑看起来不正确,请纠正我的错误。 – user5729621
你显然没有正确地关闭所有东西。有些东西仍然是开放的。请提供[最小,完整和可验证的示例](http://stackoverflow.com/help/mcve),显示如何管理所有套接字。 –