地址已经被使用——Address already in use(来自《后台开发:核心技术于应用实践》)
书本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(来自《后台开发:核心技术于应用实践》)相关推荐
- 我的 IP 地址(View IP address)
插件介绍: 很多时候我们需要使用到IP地址,这个名词可能人人都知道,但是你知道怎么查看你自己的IP地址吗?今天为大家推荐一款查看IP地址的插件.我的 IP 地址(View IP address),此应 ...
- 使用访问控制列表预防IP地址欺骗(IP Address Spoofing Prevention with ACLs)
[实验说明] 配置路由器预防IP地址欺骗 [实验拓扑] IOS:c2691-advsecurityk9-mz.124-11.T2.bin [实验配置步骤] 在网关的outside过滤RFC19 ...
- Debian下IPv6设定主地址 Set primary IPv6 address under Debian Linux
Linux下选择IPv6主地址是按照一定规则来的 #RFC3484 (davidc) Prefer same address. (i.e. destination is local machine) ...
- socket编程小问题:地址已经被使用——Address already in use
转自:http://blog.csdn.net/a_tu_/article/details/44625117 很多socket编程的初学者可能会遇到这样的问题:如果先ctrl+c结束服务器端程序的话, ...
- 2.地址已经被使用——Address already in use
很多socket编程的初学者可能会遇到这样的问题:如果先ctrl+c结束服务器端程序的话,再次启动服务器就会出现Address already in use这个错误,或者你的程序在正常关闭服务器端so ...
- 云炬Android开发笔记 14 个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装
阅读目录 0.优化 1.个人中心页面的布局 2. 订单列表逻辑梳理与实现 3. 个人信息的更新实现 3.1 个人信息页面的布局 3.3 数据的转化 5.3 图片库中图片选择事件的处理 5.4 相机 ...
- c++ 对象起始地址 指针靠齐_Go的内存对齐和指针运算详解和实践
uintptr 和 unsafe普及 uintptr 在Go的源码中uintptr的定义如下: /* uintptr is an integer type that is large enough t ...
- 如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相...
说英雄联盟准备出手游,但内测资格一直没公开,有骗子利用这个机会,伪造官方给用户发送带有钓鱼链接的邮件来盗号.. 方子就是其中一个受害者,除了他,我也去了英雄联盟的贴吧看了下,确实有很多人收到了这类邮件 ...
- 【linux】2022年还能用,网易真的是良心啊,网易云音乐linux版本现在还是可以使用的超赞!!官方网的下载地址还可以使用,音乐使用的是qt5进行开发的。
目录 前言 1,关于网易云音乐 2,可以正常使用,可以登录 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/12826151 ...
最新文章
- python版本控制神器Virtualenvwrapper的使用
- mysql利用merge存储引擎分表的方法
- 阿里云服务器Linux配置数据库、jre、tomcat、部署javaweb
- css3多行超出隐藏并打点点
- 《系统集成项目管理工程师》必背100个知识点-31WBS的分解原则
- cascade rcnn论文总结
- lichee linux nfs,SPI Flash 系统编译
- Sound Grinder Pro for Mac(音频批量编辑转换工具)
- 提交辞职申请时,领导极力挽留,还答应加薪,要不要留下来?
- jQuery实现留言板功能
- 数据结构 基于字符串模式匹配算法的病毒感染检测问题
- 《计算机网络实验教程》——验证性实验
- php读取excel并导入数据,PHPExcel读取excel并导入数据库
- win 10 如何删除需要获取管理员权限的文件和退出安全模式
- 关于google smtp邮件发送
- QST青软实训学员学习总结-2020/4/22-ZigBee
- 中国高校计算机大赛--网络技术挑战赛(C4-Network Technology Challenge)参加分享
- 英语——不定词(二)
- 组策略学习-统一部署桌面壁纸
- ADAMS的二连杆机械臂PID控制
热门文章
- matlab 中 eps 的分析
- SQLite的局限性
- 长期股权投资和私募股权投资的区别
- Teddy's Knowledge Base--基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速开发框架设计NBear V2.0.0 [开源]...
- bio阻塞的缺点_java 中的 BIO/NIO/AIO 详解
- echarts 图表配置tooltip 的formatter
- 在ElementUI中改变el-table中的el-table-column样式
- centos ftp服务器搭建_ftp软件,ftp软件安装使用教程,利用Serv-U如何搭建ftp服务器?...
- eps如何建立立体白模_从几个方面说说自动化立体仓库的特别之处
- 一个全屏页面切换实例