关于bind错误的处理:
bind: Address already in use

原因: 操作系统没有立即释放端口

解决一: 等待一段时间运行网络程序即可

解决二:通过setsockopt进行设置,关键代码如下。

         // 解决在close之后会有一个WAIT_TIME,导致bind失败的问题
int val = ;
int ret = setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,(void *)&val,sizeof(int));
if(ret == -)
{
printf("setsockopt");
exit();
}

举例:以多进程并发服务器为例

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h> #define PORT 7788 int init_tcp()
{
// 1.创建套接字 - 设置协议
int sfd = socket(AF_INET,SOCK_STREAM,);
if( - == sfd )
{
perror("socket");
exit(-);
}
//2. 解决在close之后会有一个WAIT_TIME,导致bind失败的问题
int val = ;
int ret = setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,(void *)&val,sizeof(int));
if(ret == -)
{
printf("setsockopt");
exit();
}
//3. 绑定IP和PORT
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(PORT);
ret = bind(sfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(ret == -)
{
printf("bind");
exit();
}
//4. 监听
ret = listen(sfd,);
if(ret == -)
{
printf("listen");
exit();
}
printf("Server is ready ... \n"); return sfd;
} void deal_communication(int cfd)
{
char buf[] = {'\0'};
while()
{
memset(buf,'\0',sizeof(buf));
recv(cfd,buf,sizeof(buf),);
printf("client say:%s\n",buf);
send(cfd,buf,strlen(buf),);
if(strncmp(buf,"quit",) == )
break;
} return ;
} int main()
{
//1. 初始化(创建套接字socket/地址复用+bind/listen)
int sfd = init_tcp();
//2. 并发处理客户端(accept / fork) 2-2通信
while()
{
int cfd = accept(sfd,NULL,NULL);
if(cfd == -)
{
perror("accept");
exit();
} // fork - create a child process
if(fork() == )
{
deal_communication(cfd);
close(cfd);
exit();
}
close(cfd);
signal(SIGCHLD,SIG_DFL);
}
close(sfd);
return ;
}

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

  1. 解决svnserve: Can't bind server socket: Address already in use

    最近在忙着搭建jenkins系统集成版本控制和git分布式版本控制,其中涉及到了点svn方面的,由于自己也是第一次搭建svn,挺顺利的,中间遇到点小问题: 我使用的是yum安装的svn,安装完成配置结 ...

  2. svnserve: Can’t bind server socket: Address already in use报错解决办法

    最近在学习自己搭建SVN服务,意外的报错 svnserve: Can’t bind server socket: Address already in use 于是google了下,原来是 已经启动了 ...

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

    适用于: Oracle Database - Enterprise Edition - 版本号 8.1.7.4 和更高版本号 本文档所含信息适用于全部平台 用途 怎样诊断 ORA-4030 错误 排错 ...

  4. 解决ORA-00020错误

    解决ORA-00020错误 分类: Oracle2009-05-13 17:26 3398人阅读 评论(0) 收藏 举报 数据库sessionoraclesql服务器object 项目上使用的Orac ...

  5. 如何解决Ora-04031错误(转)

    诊断并解决ORA-04031 错误 当我们在共享池中试图分配大片的连续内存失败的时候,Oracle首先清除池中当前没使用的所有对象,使空闲内存块合并.如果仍然没有足够大单个的大块内存满足请求,就会产生 ...

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

    原文:解决:错误的语法:”XXXX“必须是批处理中仅有的语句   SQL Server 数据库提示“错误的语法:”XXXX“必须是批处理中仅有的语句”报错的原因分析 解析:批处理必须以 CREATE ...

  7. Maven解决NoPluginFoundForPrefixException错误

    Maven解决NoPluginFoundForPrefixException错误方法 错误出现的原因 你指的是一个不存在的插件,如由于错误的前缀. 您使用的是第三方的Maven插件没有部署到中央Mav ...

  8. Android Studio 错误: 非法字符: &#39;\ufeff&#39; 解决方式|错误: 须要class, interface或enum

    在导入eclipse项目到Android Studio出现这种错误, 非法字符: '\ufeff' 解决方式|错误: 须要class, interface或enum.查阅后了解到Eclipse能够智能 ...

  9. 山寨一个std::bind\boost::bind

    这里是最初始的版本,参考https://github.com/cplusplus-study/fork_stl/blob/master/include/bind.hpp 提供了最简洁的实现方式. 第一 ...

随机推荐

  1. li标签包含img的问题

    我们在制作页面时,经常有可能碰到这样的设计: li   图一   图一的布局代码如下:   <ul>     <li><img src=”pic1.jpg” />& ...

  2. Java核心技术点之注解

    本博文是对Java中注解相关知识点的简单总结,若有叙述不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.什么是注解 我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一 ...

  3. DEDECMS之八 漏洞错误和疑难杂症

    1.dedecms文章加粗b属性后出现strong或者b标签修改 dedecms的文章,如果设置了加粗的属性后,文章标题那会自动添加一个strong或者是b标签,如何去掉呢,方法如下: a.更改自动添 ...

  4. DEDECMS之五 单页

    在网站开发中经常碰到关于我们.联系方式等简单的页面,那么在DEDECMS中如何实现? 一.效果 以上左侧导航的链接都是单页,右边为内容部分 二.单页的实现 创建频道封来实现 1.常规选项 2.高级选项 ...

  5. Web Api其中的PUT功能演示

    Insus.NET这几天均在学习Web API知识,并练习.怎样获取数据,提交数据或是保存数据.你可以温习一下<Post model至Web Api创建或是保存数据>http://www. ...

  6. [转]❲阮一峰❳Linux 守护进程的启动方法

    ❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...

  7. office 2010 2013卸载工具

    http://www.ithome.com/html/soft/32777.htm Office 2003 || Office 2007 || Office 2010.

  8. mediaplayer与surfaceView,无法播放问题

    mediaplayer需要在surfaceView创建之后才能创建,不然会导致错误. surfaceholder = msurface.getHolder(); surfaceholder.setKe ...

  9. VMware-Transport(VMDB) error -44:Message.The VMware Authorization Service is not running解决方案

    出现的错误如下: 原因:本机中有一个VMware服务未开启导致的. 解决方案: 1.打开“运行”->输入services.msc !!!文章转自浩瀚先森博客,转载请注明,谢谢.http://ww ...

  10. js基础知识温习:js中的对象

    在JavaScript中对象是一个无序属性的集合,其属性可以包含基本值.对象或者函数. 对象最简单的创建方式 JavaScript中创建对象最简单的方式就是创建一个Object对象的实例,然后再添加属 ...