套接字错误::地址已被使用

问题描述:

我正面临绑定到套接字的这个问题。 第一个实例正常工作,即 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或逻辑(代码而不是命令的错误没有消失,甚至除了直接杀死进程之外)处理这种情况?

+1

你是(错误地)关闭一个接受的客户端套接字,但你是否也关闭了侦听服务器套接字?您不能将新的TCP套接字绑定到与先前套接字仍然绑定的IP /端口相同的IP /端口。你为什么试图将多个套接字绑定到同一个IP /端口? –

+0

感谢您的意见。 是的,我在客户端和服务器套接字中调用close。 同样的逻辑是我的服务器线程是一个应用程序的一部分,它是基于成功启动我创建服务器线程的应用程序的一部分。即使在我的应用程序关闭后,此线程也不必不必要地处于活动状态。要处理此情况,我尝试了在调用pthread_exit时关闭套接字。 就客户而言,我认为可以在客户完成其工作时致电关闭。 如果我的逻辑看起来不正确,请纠正我的错误。 – user5729621

+0

你显然没有正确地关闭所有东西。有些东西仍然是开放的。请提供[最小,完整和可验证的示例](http://*.com/help/mcve),显示如何管理所有套接字。 –

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 herehere

+0

Thanks.Indeed错误是明确的,因为我提到。但我想重新使用相同的端口,我甚至无法在调用close(以及shutdown())之前尝试重新打开它。上述所有close()doe snot第一次返回任何错误。如果关闭失败,则close应该抛出错误,请求的fd无法关闭。保留我的查询。 – user5729621

+0

@ user5729621您可以发布您关闭之前打开的套接字的代码片段吗? –

+0

我已经发布了相同的内容。我的意思是我尝试了关闭Api和关闭Api,但接下来的绑定反复出现错误。此外,我已尝试与另一个端口号,但它抛出相同的错误 – user5729621

您不能共享,甚至与SO_REUSEADDR两个进程之间的TCP监听端口。

NB shutdown()不会关闭TCP会话。它将其关闭一半。你必须关闭套接字。

+0

该OP说:“*我试着靠近,但它没有奏效。*” –

+0

@RemyLebeau确实。很难理解为什么他会为'shutdown()'困扰,为什么他最初不使用'close()'。 – EJP