博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【unix网络编程第三版】ubuntu端口占用问题
阅读量:4197 次
发布时间:2019-05-26

本文共 2638 字,大约阅读时间需要 8 分钟。

《unix网络编程》一书中的代码并不是能直接运行,有时候需要结合各方面的知识来解决,大家在这本书的时候,一定要把代码都跑通,不难你会错过很多学习的机会!

1.问题描述

本人在阅读《UNIX网络编程》中,发现运行书中服务器端程序时,返回bind error:Address already in use!

服务器端代码如下:

#include    "unp.h"#include    
intmain(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 13tcp        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:13COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAMExinetd  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:13COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAMEdaytimetc 17791 root    3u  IPv4 4484357      0t0  TCP *:daytime (LISTEN)xinetd    17837 root    5u  IPv4 4483070      0t0  UDP *:daytime

问题到这解决了,愉快的使用13号端口把!!

参考:

转载地址:http://mmyli.baihongyu.com/

你可能感兴趣的文章
在中国提供了60亿次服务的疫情模块向世界开源
查看>>
世界卫生组织与腾讯加深合作 新冠肺炎AI自查助手全球开源
查看>>
Hibernate 中get, load 区别
查看>>
java反射详解
查看>>
JPA 注解
查看>>
JQuery 简介
查看>>
Java创建对象的方法
查看>>
Extjs自定义组件
查看>>
TreeGrid 异步加载节点
查看>>
Struts2 标签库讲解
查看>>
Google Web工具包 GWT
查看>>
材料与工程学科相关软件
查看>>
MPI的人怎么用仪器
查看>>
windows 下AdNDP 安装使用
查看>>
Project 2013项目管理教程(1):项目管理概述及预备
查看>>
ssh客户端后台运行
查看>>
哥去求职,才说了一句话考官就让我出去
查看>>
【React Native】把现代web科技带给移动开发者(一)
查看>>
【GoLang】Web工作方式
查看>>
Launch Sublime Text 3 from the command line
查看>>