Linux运行端口:深入浅出

1. 什么是端口?

在网络通信中,端口是用于区分不同程序或不同进程的逻辑地址,一个IP地址和一个端口号组成了网路中的通信节点。在一台计算机中,可以同时运行多个程序或进程,每个程序或进程都需要一个独立的端口与外部通信。

端口号的范围为0-65535,其中0-1023称为著名端口,一些常见协议已经固定使用某个端口,例如HTTP协议使用80端口。

//示例代码获取本机开放端口

#include <stdio.h>

#include <sys/socket.h>

#include <netinet/in.h>

int main() {

int listenfd;

struct sockaddr_in addr;

socklen_t len = sizeof(addr);

listenfd = socket(AF_INET, SOCK_STREAM, 0);

memset((void*)&addr, 0, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = htonl(INADDR_ANY);

addr.sin_port = 0;

bind(listenfd, (struct sockaddr*)&addr, sizeof(addr));

getsockname(listenfd, (struct sockaddr*)&addr, &len);

printf("Local port: %d\n", ntohs(addr.sin_port));

return 0;

}

以上示例代码通过socket编程获取本地开放的端口,并将端口号打印出来。

2. 查看端口占用情况

2.1 netstat命令

在Linux中,我们可以使用netstat命令来查看当前计算机上的网络连接,包括各个进程所占用的端口。下面是netstat命令的一些常用选项:

-a:显示所有连接(包括正在监听的尚未建立的连接)

-t:仅显示TCP连接

-u:仅显示UDP连接

-n:显示IP地址和端口号,而不是主机名和服务名

-p:显示每个连接所属的进程

//示例代码使用system函数执行命令

#include <stdio.h>

#include <stdlib.h>

int main() {

char cmd[1024];

sprintf(cmd, "netstat -antup | grep :80");

system(cmd);

return 0;

}

以上示例代码使用system函数执行命令netstat -antup | grep :80,查找所有占用80端口的TCP连接并打印出来。

2.2 lsof命令

在Linux中,另一个查看端口占用情况的命令是lsof。它可以显示所有进程打开的文件、目录、网络连接等信息。

//示例代码使用system函数执行命令

#include <stdio.h>

#include <stdlib.h>

int main() {

char cmd[1024];

sprintf(cmd, "lsof -i :80");

system(cmd);

return 0;

}

以上示例代码使用system函数执行命令lsof -i :80,查找所有占用80端口的进程并打印出来。

3. 端口监听

在Linux中,我们可以通过socket编程创建一个TCP或UDP套接字,将其绑定到一个端口,并监听该端口,等待外部客户端的连接。

//示例代码使用socket编程创建TCP套接字并监听端口

#include <stdio.h>

#include <sys/socket.h>

#include <netinet/in.h>

#define PORT 8080

int main() {

int listenfd, connfd;

struct sockaddr_in addr, client_addr;

socklen_t len = sizeof(client_addr);

listenfd = socket(AF_INET, SOCK_STREAM, 0);

memset((void*)&addr, 0, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = htonl(INADDR_ANY);

addr.sin_port = htons(PORT);

bind(listenfd, (struct sockaddr*)&addr, sizeof(addr));

listen(listenfd, 1024);

while(1) {

connfd = accept(listenfd, (struct sockaddr*)&client_addr, &len);

//处理连接

close(connfd);

}

close(listenfd);

return 0;

}

以上示例代码使用socket编程创建TCP套接字,绑定到8080端口,并监听该端口,等待客户端的连接。当有客户端连接时,程序接收连接,并处理连接。

4. 端口转发

在Linux中,我们可以使用iptables命令进行端口转发,将来自某个端口的数据包转发到另一个端口。下面是iptables命令的一些常用选项:

-A:追加规则至链的末尾

-t:指定表,默认为filter

-i:指定进入该计算机的接口

-o:指定离开该计算机的接口

-p:指定协议

--dport:指定目标端口

--to-destination:指定目标IP地址和端口

//示例代码使用system函数执行命令

#include <stdio.h>

#include <stdlib.h>

int main() {

char cmd[1024];

sprintf(cmd, "iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080");

system(cmd);

return 0;

}

以上示例代码使用system函数执行命令iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080,将来自eth0接口的80端口数据包转发到192.168.1.100的8080端口。

5. 总结

本文介绍了Linux中端口的相关知识,包括端口的概念、查看端口占用情况、端口监听以及端口转发。Linux上的端口管理是网络编程和安全管理中的一个重要课题,希望本文的介绍对您有所帮助。

操作系统标签