Linux中的端口占用问题

摘要:
本文将会阐述两种解决端口占用的方法。我们接下来看一下是什么进程开启了这个TCP服务:现在我们知道是xinetd服务占用了这个接口。出现这个问题的原因在于开启我们自己的程序前我们已经开启了其它占用13号端口的服务,而该已占用13号端口的服务却没有设定13号端口为可重用,最终导致我们的程序绑定端口错误。用这种方法,我们的程序和xinetd服务终于能够同时绑定端口号13,如下图所示:

本文将会阐述两种解决端口占用的方法。

本文会用到的服务器端的程序如下:

1 #include "unp.h"
2 #include <time.h>
3 
4 int main(int argc, char **argv)
5 {
6     intlistenfd, connfd;
7 socklen_t len;
8     structsockaddr_in servaddr, cliaddr;
9     charbuff[MAXLINE];
10 time_t ticks;
11 
12     listenfd = Socket(AF_INET, SOCK_STREAM, 0);
13 
14     bzero(&servaddr, sizeof(servaddr));
15     servaddr.sin_family =AF_INET;
16     servaddr.sin_addr.s_addr =htonl(INADDR_ANY);
17     servaddr.sin_port = htons(13);    /*daytime server */
18 
19     int on = 1;
20     Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
21 
22     Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
23 
24 Listen(listenfd, LISTENQ);
25 
26     for(; ;)
27 {
28         len = sizeof(cliaddr);
29         connfd = Accept(listenfd, (SA *)&cliaddr, &len);
30 
31         printf("connection from %s, port %d
",
32                 Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
33 ntohs(cliaddr.sin_port));
34 
35         ticks =time(NULL);
36         snprintf(buff, sizeof(buff), "%.24s
", ctime(&ticks));
37 Write(connfd, buff, strlen(buff));
38 
39 Close(connfd);
40 }
41 
42     exit(0);
43 }
daytimetcpsrv.c

该程序试图将TCP套接字绑定到13号端口(“给请求主机发送日期和时间”)。

问题描述

如果一个端口已经被占用,而我们的程序又绑定到该端口,则我们在运行程序的时候系统会提示错误:“bind error: Address already in use”,即端口已被占用。

解决方法1:关闭使用该端口的进程

这种方法应该是最笨的了,而且在实际中我们不大可能这样子做。

我们运行了上边提到的程序,得到了下边的结果:

Linux中的端口占用问题第1张

很明显,已经有进程占用了这个端口。我们可以先看一下是哪些服务占用了端口(在这里是13):

Linux中的端口占用问题第2张

从上图可以看出是TCP服务占用了这个端口。我们接下来看一下是什么进程开启了这个TCP服务:

Linux中的端口占用问题第3张

现在我们知道是xinetd服务占用了这个接口。我们直接关闭掉这个服务:

Linux中的端口占用问题第4张

现在开启我们的服务端程序就没问题了。

解决方法2:设置端口为可重用

在IBM的一篇文章Linux 套接字编程中的 5 个隐患中作者提出用函数setsockopt来设定端口可重用,代码如下:

/*Enable address reuse */on = 1;
ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );

但在我们的程序中,用了这种方法还是不行()。

出现这个问题的原因在于开启我们自己的程序前我们已经开启了其它占用13号端口的服务(如xinetd),而该已占用13号端口的服务却没有设定13号端口为可重用,最终导致我们的程序绑定端口错误。

正确的做法是第一个使用13号(对其它端口号也一样)端口的进程要设定13号端口为可重用,这样后续使用该端口的进程方能绑定成功。

所以我们要先运行我们的程序,将13号端口设定为可重用,然后再运行其它使用该端口的进程(如xinetd)。用这种方法,我们的程序和xinetd服务终于能够同时绑定端口号13,如下图所示:

Linux中的端口占用问题第5张

免责声明:文章转载自《Linux中的端口占用问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇adb连接不上手机,提示“List of devices attached”及相关操作C#调用WebService实例和开发(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux 安装网易云音乐

1.首先去官网下载最新的网易云 网易云音乐曾经推出官方Linux版本,提供的下载安装包有:deepin15(32位):http://s1.music.126.net/download/pc/net ... 0_i386.debdeepin15(64位):http://s1.music.126.net/download/pc/net ... _amd64.d...

linux应用之nginx的源码安装及配置(centos)

1、准备工作选首先安装这几个软件:GCC,PCRE(Perl Compatible Regular Expression),zlib,OpenSSL。Nginx是C写的,需要用GCC编译;Nginx的Rewrite和HTTP模块会用到PCRE;Nginx中的Gzip用到zlib;用命令“# gcc”,查看gcc是否安装;如果出现“gcc: no input...

Linux服务器上安装织梦CMS

安装篇 第一步:配置防火墙(默认情况下,端口80和3306是拒绝访问的,在防火墙上进行配置): vi/etc/sysconfig/iptables(在"COMMIT"的上一行加上如下两句) -AINPUT-mstate--stateNEW-mtcp-ptcp--dport80-jACCEPT(允许80端口通过防火墙) -AINPUT-mstate--s...

Linux动态链接库.so文件的创建与使用

From:http://blog.csdn.net/sunboy_2050/article/details/7346146 1. 介绍         使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加...

Linux安装loadrunner负载机【转】

1、loadrunner下载地址:http://download.csdn.net/download/intel80586/9542271或者其他资源 2、首先用rpm -qa|grep -i c++命令确认服务器是否已经安装了compat-libstdc++-33-3.2.3-61.i386.rpm,若没有下载安装下载地址:http://vdisk.we...

Linux下mysql修改连接超时(windows下也适用)

首先进入mysql,查看 wait_timeout、interactive_timeout这个值是否为默认的8小时(即 28800) [root@server110 ~]# mysql -u root -p Enter password: 输密码进入 执行如下命令 show variables like '%timeout%'; +-----------...