1

我有一个监听 unix 套接字的进程。但是,在阅读之前,我想检查有关此传入消息的一些元数据,例如它的源进程(例如,我想删除来自不受信任的发件人的消息)。是否有任何系统调用可以检索此信息。

    if(listen(sock_fd, 10) != 0) {
        assert("listen failed");
    }

    while((conn_fd = accept(sock_fd,
                       (struct sockaddr *) &address,
                       &address_length)) != -1) {
        int nbytes = 0;
        static char buffer[PAYLOAD_SZ];
        nbytes = (int)read(conn_fd, buffer, PAYLOAD_SZ);
4

3 回答 3

4

经过一番研究,我找到了最适合我需求的答案。

使用getsockopti 能够获得对等 pid。

getsockopt(fd,SOCK_STREAM, LOCAL_PEERPID, &pid, &pid_len); 

使用此功能,我还能够收集对等凭据等。只需要验证发送此查询时对等方没有关闭套接字。

于 2016-07-05T15:29:12.080 回答
0

对于 linux 内核 3.3 及其更高版本,您可以使用命令行ss -xp

这个关于Unix & Linux的问题有一个很好的讨论和答案,可以帮助你理解。

于 2016-07-04T14:51:23.283 回答
-1

getpeername()可能是您正在寻找的东西。示例代码

// assume s is a connected socket

socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;

len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);

// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
    port = ntohs(s->sin_port);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
    port = ntohs(s->sin6_port);
    inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}

printf("Peer IP address: %s\n", ipstr);
printf("Peer port      : %d\n", port);
于 2016-07-04T13:02:20.817 回答