bind()函数出现 Address already in use错误!!!

御风天 2012-04-18 10:46:51
悲剧了,出了这个错误,而且是在setsockopt()函数使用后(设置过了SOCK_REUSEADDR)的情况下,不知道怎么解决,有遇到过类似问题的人吗,google了好久,也有提这种问题的,就是没解决,唉,这个多人聊天程序都弄了一天了,哪位有解决的,告诉小弟一下,感激不尽!!!
...全文
1895 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjs1033 2014-09-13
  • 打赏
  • 举报
回复
引用 9 楼 dongqiwen9528 的回复:
你好,我也遇上了同样的问题,能帮我看看吗?谢谢

int main()
{int on,ret,len; 
int server_sockfd; 
int client_sockfd; 
struct sockaddr_in my_addr;   
struct sockaddr_in remote_addr; 
int sin_size;    
char* rec; 
char buf[BUFSIZ]; 
memset(&my_addr,0,sizeof(my_addr)); 
my_addr.sin_family=AF_INET; 
my_addr.sin_addr.s_addr=INADDR_ANY; 
my_addr.sin_port=htons(PORT);  
server_sockfd=socket(AF_INET,SOCK_STREAM,0);    
on=1;    
setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,(char*)&on,sizeof(on));     ret=bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));    
if(ret<0){  perror("bind"); }  
listen(server_sockfd,SOMAXCONN); 
sin_size=sizeof(struct sockaddr_in);   
while(1) {  
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)  
{   perror("accept");  }     
printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));  
//len=send(client_sockfd,"Welcome to my server\n",21,0);//send welcom info    len=recv(client_sockfd,buf,BUFSIZ,0);  
buf[len]='\0';  
printf("%s",buf);  
rec=strtok(buf,"\n");   
return rec;  
if(send(client_sockfd,buf,len,0)<0)  
{   perror("write");  }  
close(client_sockfd); 
}
close(server_sockfd);
return 0;
} 
你是怎样解决的,我也遇到这样的问题
JJ_66 2013-08-16
  • 打赏
  • 举报
回复
@ 9# 楼上代码这格式,谁看啊?
莱茵1314 2013-03-29
  • 打赏
  • 举报
回复
你好,我也遇上了同样的问题,能帮我看看吗?谢谢

int main()
{int on,ret,len; 
int server_sockfd; 
int client_sockfd; 
struct sockaddr_in my_addr;   
struct sockaddr_in remote_addr; 
int sin_size;    
char* rec; 
char buf[BUFSIZ]; 
memset(&my_addr,0,sizeof(my_addr)); 
my_addr.sin_family=AF_INET; 
my_addr.sin_addr.s_addr=INADDR_ANY; 
my_addr.sin_port=htons(PORT);  
server_sockfd=socket(AF_INET,SOCK_STREAM,0);    
on=1;    
setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,(char*)&on,sizeof(on));     ret=bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));    
if(ret<0){  perror("bind"); }  
listen(server_sockfd,SOMAXCONN); 
sin_size=sizeof(struct sockaddr_in);   
while(1) {  
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)  
{   perror("accept");  }     
printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));  
//len=send(client_sockfd,"Welcome to my server\n",21,0);//send welcom info    len=recv(client_sockfd,buf,BUFSIZ,0);  
buf[len]='\0';  
printf("%s",buf);  
rec=strtok(buf,"\n");   
return rec;  
if(send(client_sockfd,buf,len,0)<0)  
{   perror("write");  }  
close(client_sockfd); 
}
close(server_sockfd);
return 0;
} 
御风天 2012-07-25
  • 打赏
  • 举报
回复
你代码怎么样的?
hello__world_ 2012-07-25
  • 打赏
  • 举报
回复
你好 我也遇到这个问题了 和你的差不多 调用过setsockopt()函数以后还是出现ADDRESS ALREADY IN USE 。。请问你现在弄明白这个原因了么 。。能不能耽误您几分钟给我讲下 。。。感激不尽
justkk 2012-04-19
  • 打赏
  • 举报
回复
看看你所用的端口状态,是不是LISTEN 状态?

即使你设置了那个选项,对于LISTEN状态的端口,也是不能重复监听的
御风天 2012-04-19
  • 打赏
  • 举报
回复
我知道怎么错了,我来呢accept()干嘛用的都没搞清楚,谢谢大家了!!!
dongjiawei316 2012-04-19
  • 打赏
  • 举报
回复
不对啊!如果设上SOCK_REUSEADDR,就不会出现这个错误啊!因为地址已经可以重用,“Address already in use”也没关系的。你的源码贴出来看看?会不会是别的问题
sdu_sky 2012-04-19
  • 打赏
  • 举报
回复
换个端口试试
御风天 2012-04-19
  • 打赏
  • 举报
回复
我贴一下源代码,这是我在网上看的一个聊天程序,他上面说是支持多人聊天,采用的是select()函数,监听:
代码中的注释有我的一些疑问,请大侠指教!!(我是在一台机子上,启动服务器端,和客户段)

客户端 qq_client.c

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/un.h>

char buffer[256];
void * pthread_function(void * arg);
const int portbase = 1785; //服务器和客户端设置了同样的端口号
int main()
{
int result;
int client_socketfd;
char * local = "127.0.0.1"; //(1)网上说同一台机子,既当客户端,又当服务器端,就设置这个ip,也不知道为什么??

fd_set read_set;
int max_fd;

struct sockaddr_in client_address; //connect()用的地址信息
client_address.sin_family = AF_LOCAL;
client_address.sin_addr.s_addr = inet_addr(local);
client_address.sin_port = htons((unsigned short)portbase);
client_socketfd = socket(AF_LOCAL,SOCK_STREAM,0);

printf("client socket id is %d\n",client_socketfd); //这里可以看到client_socketfd的值为3
if(client_socketfd <0)
{
printf("socket error\n");
exit(0);
}
if(connect(client_socketfd,(struct sockaddr*)&client_address,sizeof(client_address))!= 0)
{
perror("can't connect the server\n");
exit(0);
}
max_fd = client_socketfd+1;

while(1)
{
FD_ZERO(&read_set);
FD_SET(0,&read_set);
FD_SET(client_socketfd,&read_set);

result = select(max_fd,&read_set,(fd_set*)NULL,(fd_set*)NULL,(struct timeval*)NULL); //用select()实现对socket,和键盘输入的监听
if(result<1)
{
printf("select\n");
exit(0);
}
else
{
if(FD_ISSET(0,&read_set))
{

memset(buffer,'\0',sizeof(buffer));
fgets(buffer,sizeof(buffer),stdin);
if(strncmp("quit",buffer,4) == 0)
{
printf("you quit the chat\n");
break;
}
else
{
if(write(client_socketfd,buffer,sizeof(buffer)) == -1)
{
printf("write error\n");
exit(0);
}

}
}
if(FD_ISSET(client_socketfd,&read_set))
{

memset(buffer,'\0',sizeof(buffer));
result = read(client_socketfd,buffer,sizeof(buffer));
if(result == -1)
{
printf("read error\n");
exit(0);
}
if(result == 0)
{
printf("server terminate\n");
break;
}
else
{
printf("server:%s",buffer);
}

}
}
}
close(client_socketfd);
exit(0);
}



服务器端 qq_server.c 其中用到了个线程函数pthread_function(),用来处理accept()函数监听到的链接

#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <memory.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <pthread.h>
#include <netinet/in.h>

char buffer[256];
pthread_mutex_t work_lock; //用到了互斥锁,对buffer【】这个读写区的资源管理
void * pthread_function(void * arg);
extern int errno;
const int portbase = 1785; //端口号和客户端一样
int main()
{
int opt = 1; //用于setsockopt(),不过没用,还是Address already in use ,只好改个端口号,很麻烦!
socklen_t len;
int result;
char * local ="127.0.0.1";
socklen_t length;

struct sockaddr_in server_address,client_address;
int server_socketfd,client_socketfd;
int client_length;
pthread_t a_thread;
printf("server has start\n");
memset(&server_address,0,sizeof(server_address));
server_address.sin_family = AF_LOCAL;
server_address.sin_port = htons((unsigned short) portbase);
server_address.sin_addr.s_addr = inet_addr(local); //(2)这样使用可以吗???

server_socketfd = socket(AF_LOCAL,SOCK_STREAM,0);
if(server_socketfd < 0)
{
printf("can't get a server socket\n");
exit(0);
}
len = sizeof(opt);
setsockopt(server_socketfd,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,len); //这里设置了端口可复用

result = bind(server_socketfd,(struct sockaddr*)&server_address,sizeof(server_address));
if(result<0)
{
perror("can't bind the server socket to network\n");
exit(0);
}
result = pthread_mutex_init(&work_lock,NULL); //初始化锁

if(result<0)
{
printf("can't initialize th mutex\n");
exit(0);
}
result = listen(server_socketfd,5); //可处理5个链接请求
client_length = (int)sizeof(client_address);
printf("进入无线循环\n");
while(1)
{
result = accept(server_socketfd,(struct sockaddr*)&client_address,&client_length); //accetp()获得链接请求,然后让线程处理

if(result<0)
{
printf("can't bind the server socket to network\n");
exit(0);
}
result = pthread_create(&a_thread,NULL,pthread_function,(void *)client_socketfd);
//(3)这里我真郁闷了,在客户端qq_client.c中,我查看了那个client_socketfd的值为3,但是传到线程函数中,这个值(本来我是 让 fd = (int)clien_socketfd; 发现fd的值是个很大的值,晕死!!???,怎么会这样???
if(result < 0)
{
printf("can't create the thread\n");
exit(0);
}

}
}

void * pthread_function(void * arg) //线程函数
{
int fd = 3; //我直接 fd = 3了,那个值,真不知道怎么来的,其实这样也就无法多人聊天,但是这一对一,也有问题,唉!!!
int max_fd;
int result;
fd_set read_set;

printf("chat begin\n");
while(1)
{
FD_ZERO(&read_set);
FD_SET(0,&read_set);
FD_SET(fd,&read_set);

max_fd = fd+1;
pthread_mutex_lock(&work_lock);

result = select(max_fd,&read_set,(fd_set*)NULL,(fd_set*)NULL,(struct timeval*)NULL);

if(result < 1)
{
printf("select");
}

if(FD_ISSET(0,&read_set)) //服务器端有键盘输入
{
printf("服务器端有输入#\n");
memset(buffer,'\0',sizeof(buffer));
fgets(buffer,sizeof(buffer),stdin);
if(strncmp("quit",buffer,4) == 0) //如果输入的是quit,聊天结束,解锁
{
printf("server has terminate thr chat\n");
pthread_mutex_unlock(&work_lock);
break;
}
else
{
result = write(fd,buffer,sizeof(buffer));
if(result<0)
{
perror("write error:");
exit(0);
}

}
}

if(FD_ISSET(fd,&read_set)) //客户端通过socket有信息到达服务器端
{
printf("客户端的信息到达\n");
memset(buffer,'\0',sizeof(buffer));
result = read(fd,buffer,sizeof(buffer));
if(result < 0)
{
printf("can't read from the client socket\n");
exit(0);
}
if(result==0)
{
printf("the client has terminate the chat\n");
pthread_mutex_unlock(&work_lock);
break;
}
else
{
printf("client:%s\n",buffer);
}
}
pthread_mutex_unlock(&work_lock);
sleep(1); //防止单个线程一直占用buffer【】读写区,而不能实现多人聊天
}
close(fd);
pthread_exit(NULL);
}


我运行
# ./qq_server 显示如下
进入无限循环
chat begin

然后我运行 ./qq_client 显示如下
client socket id is 3
我再输入数字 45后回车 服务器端什么反映都没有,

然后我再在服务器端写了个字母 如 : abc
出现

服务器端有输入#
write error:: Transport endpoint is not connected

客户端则出现 read error 的提示信息

哪位大侠,能帮我看看怎么错了,小弟感激不尽,这学期刚学的linux网络编程,自己想练练,改的程序,如有低端错误,别见笑啊!^_^!!
Liv2005 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

看看你所用的端口状态,是不是LISTEN 状态?

即使你设置了那个选项,对于LISTEN状态的端口,也是不能重复监听的
[/Quote]

同感,一般已经使用了的端口是不能再次被bind的,除非考虑用端口复用的一些方案

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧