【问题标题】:BIND ERROR : Address already in use绑定错误:地址已在使用中
【发布时间】:2011-01-09 23:52:07
【问题描述】:

我正在学习 c 中的套接字编程,我编写了这个简单的程序来接受端口 5072 上的连接。我使用 telnet 连接到它。这第一次工作正常,但是当我尝试立即再次运行它时,它无法显示 BIND :地址已在使用中,但一分钟左右后再次开始工作。我在做什么?

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>


int main(){

//variables

int listenfd, clientfd;
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;

//getsocket
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
perror("SOCKET");
exit(0);
}


//prep the servaddr
bzero(&servaddr,sizeof servaddr);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr ("127.0.0.1");
servaddr.sin_port = htons(5072);


//bind
if(bind(listenfd, (struct sockaddr *) &servaddr,sizeof servaddr)<0){
perror("BIND");
exit(0);
}



//listen
if(listen(listenfd,20)<0){
perror("LISTEN");
exit(0);

}


//accept
int counter = 1;
clilen = sizeof cliaddr;
while(counter<3){

clientfd = accept(listenfd,(struct sockaddr *) &cliaddr,&clilen);
if(clientfd == -1){
perror("ACCEPT");
exit(0);
}
if(fork()==0){
 close(listenfd);
 printf("CONNECTION NO. %d\n",counter);
close(clientfd);
exit(0);
}
counter++;
close(clientfd);
}
close(listenfd); 
} 

谢谢

【问题讨论】:

  • 请发布显示问题的最小代码。
  • 对不起,我不知道绑定调用或子进程结构是否有错误,所以我发布了整个事情。但以后会注意的。

标签: network-programming unix


【解决方案1】:

你必须setsockopt(SO_REUSEADDR)

请参阅this faq 了解原因。

【讨论】:

    【解决方案2】:

    或者只是等待几分钟。 TCP/IP 堆栈在关闭后保留套接字的最大段生命周期的两倍,以防止来自第一个连接的任何杂散数据包在第二个连接建立后出现,这会使一切变得混乱。

    【讨论】:

    • 这个答案真的有用吗?他在问自己做错了什么——此外,abhishek 已经提到等待一分钟可以解决问题……
    猜你喜欢
    • 2016-10-24
    • 2012-05-02
    • 2020-10-06
    • 2018-03-20
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多