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上的端口管理是网络编程和安全管理中的一个重要课题,希望本文的介绍对您有所帮助。