解决bind错误 bind: Address already in use

关于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 int init_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     struct sockaddr_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 ... \n");
49
50     return sfd;
51 }
52
53 void deal_communication(int cfd)
54 {
55     char buf[64] = {‘\0‘};
56     while(1)
57     {
58         memset(buf,‘\0‘,sizeof(buf));
59         recv(cfd,buf,sizeof(buf),0);
60         printf("client say:%s\n",buf);
61         send(cfd,buf,strlen(buf),0);
62         if(strncmp(buf,"quit",4) == 0)
63         break;
64     }
65
66     return ;
67 }
68
69
70 int main()
71 {
72     //1. 初始化(创建套接字socket/地址复用+bind/listen)
73     int sfd = init_tcp();
74     //2. 并发处理客户端(accept / fork) 2-2通信
75     while(1)
76     {
77         int cfd = accept(sfd,NULL,NULL);
78         if(cfd == -1)
79         {
80             perror("accept");
81             exit(1);
82         }
83
84         // fork - create a child process
85         if(fork() == 0)
86         {
87             deal_communication(cfd);
88             close(cfd);
89             exit(0);
90         }
91         close(cfd);
92         signal(SIGCHLD,SIG_DFL);
93     }
94     close(sfd);
95     return 0;
96 }
时间: 2024-10-13 05:14:00

解决bind错误 bind: Address already in use的相关文章

解决“Can&#39;t bind to local 8630 for debugger”错误--查杀多余进程

Can't bind to local 8630 for debugger 表明本地8630端口被占用 1.Windows平台 在windows命令行窗口下执行: 1.查看所有的端口占用情况 C:\>netstat -ano 协议    本地地址                     外部地址               状态                   PID TCP    127.0.0.1:8700         0.0.0.0:0              LISTENING

android java.net.BindException: bind failed: EADDRINUSE (Address already in use)

今天遇到一种情况,在手机上发广播包,在4.4.2上的手机会发生,4.1.2和4.0.2都没有遇见,问题是这样的 try{ DatagramSocket udpSocket = new DatagramSocket(DEFAULT_PORT ); } catch (Exception e) { e.printStackTrace(); } //java.net.BindException: bind failed: EADDRINUSE (Address already in use) 解决方法:

诊断并解决 ORA-4030 错误 (Doc ID 1548826.1)

适用于: Oracle Database - Enterprise Edition - 版本号 8.1.7.4 和更高版本号 本文档所含信息适用于全部平台 用途 怎样诊断 ORA-4030 错误 排错步骤 诊断并解决 ORA-4030 错误 ORA-4030 意味着什么? 你可能在日志文件里或者屏幕上看到这个错误: ORA-04030 'out of process memory when trying to allocate %s bytes (%s,%s)' 该错误意味着 Oracle Se

centos yum安装ftp 及解决vsftp错误500 OOPS: cannot change directory:/home/**

centos yum安装ftp 及解决vsftp错误500 OOPS: cannot changedirectory:/home/**   1.查看服务器有没有安装ftp包 rpm -qa |grep vsftp 2.yum  安装 yum -y install vsftpd 3.启动vsftp的服务 service vsftpd start 4.关闭防火墙 service iptables stop 5.测试匿名访问 修改配置文件 vsftpd.conf [[email protected]

暂且解决INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误

有时候我们在APK安装时由于工程制定了UID,换过签名后可能出现 类似 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 或 INSTALL_FAILED_UPDATE_INCOMPATIBLE 的错误 ,对于后者我们可以通过Logcat看到具体的比如说 has no signatures that match those in shared user 这样的关键字, 这是由于使用了sharedUserId后你使用了不同的签名造成的. Android中共享UID可以

【体系结构问题解决,1】解决4031错误方法

三.解决4031错误方法: (ora-4031错误产生原因:大量的硬解析后,导致链上的chunk都变的非常小,此时来了一个大的sql会找不到合适的chunk,就会报ora-4031错误.) 如果SHARED_POOL_SIZE 设置得足够大,又可以排除 Bug 的因素,那么大多数的ORA- 04031 错误都是由共享池中的大量的SQL 代码等导致过多内存碎片引起的. 1.执行alter system flush shared_pool; 清理library cache 和rows cache ,

解决VTune错误PMU resources currently being used by another profiling tool or process

错误信息: When I ran Hardware Event-based Sampling Analysis 0, it showed the ERROR: Collection failed Collection failed. The data cannot be displayed. PMU resource(s) currently being used by  another profiling tool or process. 错误解决方法: 解决VTune错误PMU resour

解决编译错误 implicit declaration of function &#39;strptime&#39;

根据man手册,在文件中加上以下定义,应该可以去处该warning #define _XOPEN_SOURCE /* glibc2 needs this */ #include 但不起作用(重新编译还是有该warning) 加上编译选项-D_XOPEN_SOURCE又出现一大推其他编译错误 最后在找到这篇帖子 http://stackoverflow.com/questions/15334558/compiler-gets-warnings-when-using-strptime-functio

解决:错误的语法:”XXXX“必须是批处理中仅有的语句

原文:解决:错误的语法:”XXXX“必须是批处理中仅有的语句 SQL Server 数据库提示“错误的语法:”XXXX“必须是批处理中仅有的语句”报错的原因分析 解析:批处理必须以 CREATE 语句开始.也就是说一个查询分析器里面只有一个批处理语句才是规范的语法. CREATE DEFAULT.CREATE FUNCTION.CREATE PROCEDURE.CREATE RULE.CREATE SCHEMA.CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其他语