【unix网络编程第三版】ubuntu端口占用问题
《unix网络编程》一书中的代码并不是能直接运行,有时候需要结合各方面的知识来解决,大家在这本书的时候,一定要把代码都跑通,不难你会错过很多学习的机会!
1.问题描述
本人在阅读《UNIX网络编程》中,发现运行书中服务器端程序时,返回bind error:Address already in use!
服务器端代码如下:
#include "unp.h"
#include <time.h>
int
main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t len;
struct sockaddr_in servaddr,cliaddr;
char buff[MAXLINE];
time_t ticks;
//创建套接字
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
//初始化套接字
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;//IPv4协议
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//通配地址,一般为0
servaddr.sin_port = htons(13);//时间服务端口
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for ( ; ; ) {
len = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &len);
printf("connection from %s, port %d/n", inet_ntop(AF_INET,&cliaddr.sin_addr,buff,sizeof(buff)),//将二进制地址转换成点分十进制地址
ntohs(cliaddr.sin_port));//端口好
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
Write(connfd, buff, strlen(buff));
Close(connfd);
}
}
该代码的作用是将TCP套接字绑定到13号端口,以便给客户端发送日期和时间。
2. 问题解决
2.1 方法一:关闭该端口的进程
我们在运行服务器端代码的时候会出现以下错误:
root@zc:/home/zc/Documents/unp# ./daytimetcpsrv
bind error: Address already in use
于是查一下netstat来判断那个进程占用了13号端口(netstat -apn | grep 13):
root@zc-Inspiron-N4010:/home/zc/Documents/unp# netstat -apn | grep 13
tcp 0 0 0.0.0.0:13 0.0.0.0:* LISTEN 6432/xinetd
tcp 0 1 192.168.191.2:57984 61.135.189.223:80 SYN_SENT 1374/fcitx
显示xinetd占用了端口13,再来看看哪个进程占用了12端口:
root@zc-Inspiron-N4010:/home/zc/Documents/unp# sudo lsof -i:13
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 6432 root 5u IPv4 208386 0t0 TCP *:daytime (LISTEN)
xinetd 6432 root 6u IPv4 208387 0t0 UDP *:daytime
现在,通过sudo kill XXXX就能杀掉这个进程,让13号端口空闲出来了。
2.2 解决方案二:设置端口为可重用
在unp一书中,bind函数上提到过“Address already in use”的解决方案。7.5节中通过函数将其设为可重用即可。
int on = 1;
int ret = setsockopt(sock,SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
但是,在我们的程序中,还是不行!
于是,我们细想,xinetd是第一个占用13端口的,它在启动的时候没有设置这个端口可重用,自然我们的程序也没办法重用这个端口,所以,结合上述两个方案,最终的解决方案是:首先kill掉xinetd服务,然后运行我们的程序,再开启xinet,即可。
//首先执行
sudo kill 6432
//然后运行我们的程序
# ./daytimetcpsrv
//再重启xinetd
# service xinetd restart
//这个时候查看13号端口
# sudo lsof -i:13
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
daytimetc 17791 root 3u IPv4 4484357 0t0 TCP *:daytime (LISTEN)
xinetd 17837 root 5u IPv4 4483070 0t0 UDP *:daytime
问题到这解决了,愉快的使用13号端口把!!
参考:
【unix网络编程第三版】ubuntu端口占用问题的更多相关文章
- 【unix网络编程第三版】阅读笔记(三):基本套接字编程
unp第三章主要介绍了基本套接字编程函数.主要有:socket(),bind(),connect(),accept(),listen()等. 本博文也直接进入正题,对这几个函数进行剖析和讲解. 1. ...
- 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数
本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...
- 【UNIX网络编程第三版】阅读笔记(一):代码环境搭建
粗略的阅读过<TCP/IP详解>和<计算机网络(第五版)>后,开始啃这本<UNIX网络编程卷一:套接字联网API>,目前linux下的编程不算太了解,在阅读的过程中 ...
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
unp第二章主要将了TCP和UDP的简介,这些在<TCP/IP详解>和<计算机网络>等书中有很多细致的讲解,可以参考本人的这篇博客[计算机网络 第五版]阅读笔记之五:运输层,这 ...
- unix网络编程第三版源代码ubuntu下配置的问题解决
第一步:首先下载本书配套的源码unpv13e.tar.gz 第二步:解压后进入根文件夹有一个README 4 Execute the following from the src/ directory ...
- 【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例
本篇博客主要记录一个完整的TCP客户/服务器实例的编写,以及从这个实例中引发的对僵死进程的处理等问题. 1. TCP客户/服务器功能需求 本实例完成以下功能: (1) 客户从标准输入读入一行文本,并写 ...
- UNIX 网络编程第三版
第五章p102: ps -t pts/6 -o pid,ppid,tty,stat,args,wchan 在我的系统上运行时出现:TTY not found linux发行版为mint17.1 改用 ...
- Unix网络编程第三版源码编译
配置: $ cd Unix-Network-Programming/ $ chmod 755 configure $ ./configure 主要的工作是检查系统是否有源码编译所依赖的各种资源(系统版 ...
- UNIX网络编程——ICMP报文分析:端口不可达
ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节(包含源端口和目的端口).在我们的例子中,跟在IP首部后面的前 ...
随机推荐
- kibana使用
最近,被老大叫写一个kibana的使用方法给所有人用. 注意的一点: 能不用空格表示OR或者AND就不用空格表示,因为要么全用要么全部不用,否则会因为解析搜索同级的时候,若出现空格和OR,会冲突覆盖意 ...
- Django笔记--模型
ORM是"对象-关系-映射"的简称,在Django当中,ORM就是模型类的管理器对象.操作顺序是先定义模型类,再定义模型类管理器,然后在模型类中实例化一个模型类管理器的对象,作为模 ...
- git reset揭秘
一.命令 首先,让我们来解释几个定义. HEAD(头) 指向当前branch最顶端的一个commit,该分支上一次commit后的节点 Index(索引) The index, ...
- UCSC下载ENCODE数据
ENCODE数据库用于存放基因组原件,所有的测序数据(原始数据以及每一步处理后的数据以及最终的结果)都是开放下载的.假如说去官网下载的话会比较麻烦,这里可以通过UCSC的数据库下载(真的是神器啊)!下 ...
- Oracle中rownum的说明及使用技巧
一.rownum的说明 rownum是oracle特有的一个关键字. (1)对于基表,在insert记录时,oracle就按照insert的顺序,将rownum分配给每一行记录,因此在select一个 ...
- JAVA Eclipse使用Maven构建web项目详解(SSM框架)
tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...
- SQL Server 虚拟化(2)——理想的SQL Server虚拟机架构
本文属于SQL Server虚拟化系列 搭建SQL Server虚拟机,在各个组织之间都有自己的标准和最佳实践.从第一眼看去,光物理配置就有过百种,所有的这些细微差别都有可能为后续日常管理过程中故障侦 ...
- Dubbo框架应用之(三)--Zookeeper注册中心、管理控制台的安装及讲解
我是在linux下使用dubbo-2.3.3以上版本的zookeeper注册中心客户端.Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心.Dubbo未对 ...
- Mac 下安装运行Rocket.chat
最近花了一周的时间,复习了HTML.CSS.原生JS,并学习了Node.js.CoffeeScript.js.MongoDB,入了下门. 因为准备在Rocket.chat 上做二次开发,所以先下载和安 ...
- Linux动态频率调节系统CPUFreq之三:governor
在上一篇文章中,介绍了cpufreq的core层,core提供了cpufreq系统的初始化,公共数据结构的建立以及对cpufreq中其它子部件提供注册功能.core的最核心功能是对policy的管理, ...