You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知进程接受连接后得到套接字描述符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文件系统和网络工具查:

  1. 先找到你的进程PID,然后查看这个套接字对应的inode:
    ls -l /proc/[你的进程PID]/fd/1024
    
    输出会类似lrwx------ 1 root root 64 Aug 10 14:23 1024 -> socket:[123456],这里的123456就是这个套接字的inode编号。
  2. 用ss命令匹配这个inode,就能拿到所有详细信息:
    ss -ti ino=123456
    
    或者用旧一点的netstat:
    netstat -ti | grep 123456
    
    输出里会明确显示客户端的IP、端口,还有套接字的状态等内容。

注意:如果不是进程的所有者或者root用户,可能没法访问/proc下的对应文件,不过进程自己调用API是完全没问题的,毕竟是自己打开的套接字。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:58:59