linux中端口的欺骗,Linux中的端口占用问题

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 #include "unp.h"

2 #include

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:关闭使用该端口的进程

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

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

5f300b174bf8d59bd0e53f34f21353ff.png

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

b9c230aeb97d94de5ea5e91ff6ef28b0.png

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

f9fa4f2f2238b7583562c1885ec467cd.png

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

d76901f22929fbf360ecb79d5c22864f.png

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

解决方法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,如下图所示:

9149391e908e0b70d58f52c08f9096ca.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值