书本P260例7.3中

server如果被第二次启动,就会出现如下错误:

bind:Address already in use

解决方案如下:

首先删除所有的.o文件,然后对

server代码修改如下:

#include <sys/types.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>
#define DEFAULT_PORT 6666
int main( int argc, char ** argv){
    int serverfd,acceptfd; /* 监听socket: serverfd,数据传输socket: acceptfd */
    struct sockaddr_in my_addr; /* 本机地址信息 */
    struct sockaddr_in their_addr; /* 客户地址信息 */
    unsigned int sin_size, myport=6666, lisnum=10;
    if ((serverfd = socket(AF_INET , SOCK_STREAM, 0)) == -1) {
       perror("socket" );
       return -1;
    }
    printf("socket ok \n");
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(DEFAULT_PORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    int on=1;  
    if((setsockopt(serverfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)  
    {  
        perror("setsockopt failed");  
        exit(EXIT_FAILURE);  
    }  

    bzero(&(my_addr.sin_zero), 0);
    if (bind(serverfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr )) == -1) {
        perror("bind" );
        return -2;
    }
    printf("bind ok \n");
    if (listen(serverfd, lisnum) == -1) {
        perror("listen" );
        return -3;
    }
    printf("listen ok \n");

fd_set client_fdset;/*监控文件描述符集合*/
int maxsock;            /*监控文件描述符中最大的文件号*/
struct timeval tv;/*超时返回时间*/
int client_sockfd[5];   /*存放活动的sockfd*/
bzero((void*)client_sockfd,sizeof(client_sockfd));
int conn_amount = 0;    /*用来记录描述符数量*/
maxsock = serverfd;
char buffer[1024];
int ret=0;
while(1){
/*初始化文件描述符号到集合*/
FD_ZERO(&client_fdset);
/*加入服务器描述符*/
FD_SET(serverfd,&client_fdset);
/*设置超时时间*/
tv.tv_sec = 30; /*30秒*/
tv.tv_usec = 0;
/*把活动的句柄加入到文件描述符中*/
for(int i = 0; i < 5; ++i){
/*程序中Listen中参数设为5,故i必须小于5*/
   if(client_sockfd[i] != 0){
       FD_SET(client_sockfd[i], &client_fdset);
   }
     }
/*printf("put sockfd in fdset!\n");*/
/*select函数*/
ret = select(maxsock+1, &client_fdset, NULL, NULL, &tv);
if(ret < 0){
   perror("select error!\n");
   break;
}
else if(ret == 0){
   printf("timeout!\n");
   continue;
}
/*轮询各个文件描述符*/
for(int i = 0; i < conn_amount; ++i){
/*FD_ISSET检查client_sockfd是否可读写,>0可读写*/
   if(FD_ISSET(client_sockfd[i], &client_fdset)){
       printf("start recv from client[%d]:\n",i);
       ret = recv(client_sockfd[i], buffer, 1024, 0);
       if(ret <= 0){
   printf("client[%d] close\n", i);
   close(client_sockfd[i]);
   FD_CLR(client_sockfd[i], &client_fdset);
   client_sockfd[i] = 0;
       }
       else{
printf("recv from client[%d] :%s\n", i, buffer);
       }
   }
}
/*检查是否有新的连接,如果收,接收连接,加入到client_sockfd中*/
if(FD_ISSET(serverfd, &client_fdset)){
   /*接受连接*/
   struct sockaddr_in client_addr;
        size_t size = sizeof(struct sockaddr_in);
int sock_client = accept(serverfd, (struct sockaddr*)(&client_addr), (unsigned int*)(&size));
if(sock_client < 0){
perror("accept error!\n");
continue;
}
/*把连接加入到文件描述符集合中*/
if(conn_amount < 5){
client_sockfd[conn_amount++] = sock_client;
bzero(buffer,1024);
strcpy(buffer, "this is server! welcome!\n");
send(sock_client, buffer, 1024, 0);
printf("new connection client[%d] %s:%d\n", conn_amount, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
bzero(buffer,sizeof(buffer));
ret = recv(sock_client, buffer, 1024, 0);
if(ret < 0){
   perror("recv error!\n");

close(serverfd);
   return -1;
}
printf("recv : %s\n",buffer);
if(sock_client > maxsock){
maxsock = sock_client;
}
else{
   printf("max connections!!!quit!!\n");
   break;
}
   }
  }
}
for(int i = 0; i < 5; ++i){
if(client_sockfd[i] != 0){
   close(client_sockfd[i]);
}
}
   printf("serverfd = %d\n",serverfd);
   printf("acceptfd = %d\n",acceptfd);
close(serverfd);
return 0;

}

client代码不变

然后对server和client代码进行重新编译即可

地址已经被使用——Address already in use(来自《后台开发:核心技术于应用实践》)相关推荐

  1. 我的 IP 地址(View IP address)

    插件介绍: 很多时候我们需要使用到IP地址,这个名词可能人人都知道,但是你知道怎么查看你自己的IP地址吗?今天为大家推荐一款查看IP地址的插件.我的 IP 地址(View IP address),此应 ...

  2. 使用访问控制列表预防IP地址欺骗(IP Address Spoofing Prevention with ACLs)

    [实验说明] 配置路由器预防IP地址欺骗   [实验拓扑] IOS:c2691-advsecurityk9-mz.124-11.T2.bin [实验配置步骤]   在网关的outside过滤RFC19 ...

  3. Debian下IPv6设定主地址 Set primary IPv6 address under Debian Linux

    Linux下选择IPv6主地址是按照一定规则来的 #RFC3484 (davidc) Prefer same address. (i.e. destination is local machine) ...

  4. socket编程小问题:地址已经被使用——Address already in use

    转自:http://blog.csdn.net/a_tu_/article/details/44625117 很多socket编程的初学者可能会遇到这样的问题:如果先ctrl+c结束服务器端程序的话, ...

  5. 2.地址已经被使用——Address already in use

    很多socket编程的初学者可能会遇到这样的问题:如果先ctrl+c结束服务器端程序的话,再次启动服务器就会出现Address already in use这个错误,或者你的程序在正常关闭服务器端so ...

  6. 云炬Android开发笔记 14 个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装

    阅读目录 0.优化 1.个人中心页面的布局 2. 订单列表逻辑梳理与实现 3. 个人信息的更新实现 3.1 个人信息页面的布局 3.3 数据的转化  5.3 图片库中图片选择事件的处理  5.4 相机 ...

  7. c++ 对象起始地址 指针靠齐_Go的内存对齐和指针运算详解和实践

    uintptr 和 unsafe普及 uintptr 在Go的源码中uintptr的定义如下: /* uintptr is an integer type that is large enough t ...

  8. 如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相...

    说英雄联盟准备出手游,但内测资格一直没公开,有骗子利用这个机会,伪造官方给用户发送带有钓鱼链接的邮件来盗号.. 方子就是其中一个受害者,除了他,我也去了英雄联盟的贴吧看了下,确实有很多人收到了这类邮件 ...

  9. 【linux】2022年还能用,网易真的是良心啊,网易云音乐linux版本现在还是可以使用的超赞!!官方网的下载地址还可以使用,音乐使用的是qt5进行开发的。

    目录 前言 1,关于网易云音乐 2,可以正常使用,可以登录 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/12826151 ...

最新文章

  1. python版本控制神器Virtualenvwrapper的使用
  2. mysql利用merge存储引擎分表的方法
  3. 阿里云服务器Linux配置数据库、jre、tomcat、部署javaweb
  4. css3多行超出隐藏并打点点
  5. 《系统集成项目管理工程师》必背100个知识点-31WBS的分解原则
  6. cascade rcnn论文总结
  7. lichee linux nfs,SPI Flash 系统编译
  8. Sound Grinder Pro for Mac(音频批量编辑转换工具)
  9. 提交辞职申请时,领导极力挽留,还答应加薪,要不要留下来?
  10. jQuery实现留言板功能
  11. 数据结构 基于字符串模式匹配算法的病毒感染检测问题
  12. 《计算机网络实验教程》——验证性实验
  13. php读取excel并导入数据,PHPExcel读取excel并导入数据库
  14. win 10 如何删除需要获取管理员权限的文件和退出安全模式
  15. 关于google smtp邮件发送
  16. QST青软实训学员学习总结-2020/4/22-ZigBee
  17. 中国高校计算机大赛--网络技术挑战赛(C4-Network Technology Challenge)参加分享
  18. 英语——不定词(二)
  19. 组策略学习-统一部署桌面壁纸
  20. ADAMS的二连杆机械臂PID控制

热门文章

  1. matlab 中 eps 的分析
  2. SQLite的局限性
  3. 长期股权投资和私募股权投资的区别
  4. Teddy's Knowledge Base--基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速开发框架设计NBear V2.0.0 [开源]...
  5. bio阻塞的缺点_java 中的 BIO/NIO/AIO 详解
  6. echarts 图表配置tooltip 的formatter
  7. 在ElementUI中改变el-table中的el-table-column样式
  8. centos ftp服务器搭建_ftp软件,ftp软件安装使用教程,利用Serv-U如何搭建ftp服务器?...
  9. eps如何建立立体白模_从几个方面说说自动化立体仓库的特别之处
  10. 一个全屏页面切换实例