关于bind错误的处理:
bind: Address already in use
原因: 操作系统没有立即释放端口
解决一: 等待一段时间运行网络程序即可
解决二:通过setsockopt进行设置,关键代码如下。
1 //解决在close之后会有一个WAIT_TIME,导致bind失败的问题 2 int val = 1; 3 int ret = setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,(void *)&val,sizeof(int)); 4 if(ret == -1) 5 { 6 printf("setsockopt"); 7 exit(1); 8 }
举例:以多进程并发服务器为例
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 #include <netinet/in.h> 8 #include <arpa/inet.h> 9 #include <signal.h> 10 11 #define PORT 7788 12 13 intinit_tcp() 14 { 15 //1.创建套接字 - 设置协议 16 int sfd = socket(AF_INET,SOCK_STREAM,0); 17 if( -1 ==sfd ) 18 { 19 perror("socket"); 20 exit(-1); 21 } 22 //2. 解决在close之后会有一个WAIT_TIME,导致bind失败的问题 23 int val = 1; 24 int ret = setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,(void *)&val,sizeof(int)); 25 if(ret == -1) 26 { 27 printf("setsockopt"); 28 exit(1); 29 } 30 //3. 绑定IP和PORT 31 structsockaddr_in saddr; 32 saddr.sin_family =AF_INET; 33 saddr.sin_addr.s_addr =INADDR_ANY; 34 saddr.sin_port =htons(PORT); 35 ret = bind(sfd,(struct sockaddr *)&saddr,sizeof(saddr)); 36 if(ret == -1) 37 { 38 printf("bind"); 39 exit(1); 40 } 41 //4. 监听 42 ret = listen(sfd,5); 43 if(ret == -1) 44 { 45 printf("listen"); 46 exit(1); 47 } 48 printf("Server is ready ... "); 49 50 returnsfd; 51 } 52 53 void deal_communication(intcfd) 54 { 55 char buf[64] = {'