我有一个监听unix socket的进程。 但是,在我阅读之前,我想检查有关此传入消息的一些元数据,例如它的源进程(比方说我想从非受信任的发件人中删除消息)。是否有任何系统调用来检索此信息。
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);
答案 0 :(得分:1)
经过一些研究,我找到了最适合我需要的答案。
使用getsockopt
我能够获得对等pid。
getsockopt(fd,SOCK_STREAM, LOCAL_PEERPID, &pid, &pid_len);
使用此功能我还能够收集对等凭据等等。只需要在发送此查询时验证对等方是否关闭套接字。
答案 1 :(得分:0)
答案 2 :(得分:-1)
getpeername()
可能就是您要找的。 Example code:
// 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);