如何找出通过 TCP 连接的给定进程的 IP 地址

How to find out IP address of a given process connected through TCP

所以我想获得一个进程(订阅者)正在工作的机器的地址,所以我可以在消息中将它发送给服务器(中介),紧挨着一个特定的端口,这样服务器就可以回答在另一个端口上。

也就是说,他们将要连接,但我想要另一个端口的答案。所以我想转发订阅者地址旁边的端口,以便服务器可以连接。

我相信一种方法与找到的示例类似

http://beej.us/guide/bgnet/output/html/multipage/getaddrinfoman.html

所以我会使用 getaddrinfo 来做这样的事情

if ((rv = getaddrinfo(NULL, "3490", &hints, &servinfo)) != 0) {

然后我会在链表中查找地址 dir_tcp_srv.sin_addr.s_addr

但我认为这其实不是正确的用法。我不完全明白,但我相信这不是这样做的方式。

我想有很多方法可以做到这一点,但本质上我想获取数据(我已经有了端口号)以便客户端和服务器角色切换,并且服务器与客户端建立连接

编辑:好的,所以我一次又一次地阅读服务器如何在连接后知道客户端的地址。我正在重新阅读手册页以了解如何获取该信息,但还找不到。

另外,我发现了这个:

https://suite.io/guy-lecky-thompson/7sd21g

但我不能说我完全明白了。

Edit2:我想我的概念错了很久了。

在我的代码中,我这样接受:

fdSocketDevuelto = accept(sock_tcp, (struct sockaddr )&dir_tcp_srv, (socklen_t) &sizeSock);

我现在认为它覆盖了以前存储在结构中的信息,我曾经用客户端的信息绑定、监听所有这些。如果有人能证实这一点,我可以用这个作为答案对我自己的问题发表评论,或者删除整个内容,因为这是我从未完全理解的内容 understood/used.

我理解您的问题,因为您想让服务器找到客户端的 IP 地址和端口。看看 getpeername():

来自 Beej 的指南:

http://beej.us/guide/bgnet/output/html/multipage/getpeernameman.html

// 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);