已知进程接受连接后得到套接字描述符1024,如何获取其客户端端口等信息?
当然可以!手里攥着这个套接字描述符(1024),完全能从Linux系统掏出你要的客户端端口这类信息。下面分两种场景给你说清楚:
编程层面(进程内直接调用API)
在你的进程里,直接用系统调用就能拿到信息,核心是两个函数:
- getpeername():专门用来获取对端(也就是客户端)的地址信息,包括IP和端口。用C语言的话,代码大概是这样:
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <errno.h> int main() { int sockfd = 1024; // 你的目标套接字描述符 struct sockaddr_in peer_addr; socklen_t addr_len = sizeof(peer_addr); if (getpeername(sockfd, (struct sockaddr*)&peer_addr, &addr_len) == 0) { char ip_str[INET_ADDRSTRLEN]; // 把网络字节序的IP转成字符串格式 inet_ntop(AF_INET, &peer_addr.sin_addr, ip_str, INET_ADDRSTRLEN); // 端口是网络字节序,要转成主机字节序才是正常的数字 int client_port = ntohs(peer_addr.sin_port); printf("客户端IP: %s, 端口: %d\n", ip_str, client_port); } else { perror("调用getpeername失败"); } return 0; }
别忘了解析端口时用ntohs()转字节序,不然拿到的会是乱码一样的数字。
- getsockname():如果还想知道服务器本地的端口和IP,就用这个函数,用法和
getpeername()几乎一致,只是返回的是本地套接字的信息。
命令行层面(进程外查询)
要是不想改代码,也能通过Linux的proc文件系统和网络工具查:
- 先找到你的进程PID,然后查看这个套接字对应的inode:
输出会类似ls -l /proc/[你的进程PID]/fd/1024lrwx------ 1 root root 64 Aug 10 14:23 1024 -> socket:[123456],这里的123456就是这个套接字的inode编号。 - 用
ss命令匹配这个inode,就能拿到所有详细信息:
或者用旧一点的ss -ti ino=123456netstat:
输出里会明确显示客户端的IP、端口,还有套接字的状态等内容。netstat -ti | grep 123456
注意:如果不是进程的所有者或者root用户,可能没法访问/proc下的对应文件,不过进程自己调用API是完全没问题的,毕竟是自己打开的套接字。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

