繁体   English   中英

如何找出通过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);

我现在认为这是覆盖先前存储在该结构中的信息,该信息过去一直用于与客户机的信息绑定,侦听所有这些信息。 如果有人可以确认这一点,我可以以此为答案来评论自己的问题,或者删除整个内容,因为这是我从未完全理解/使用过的东西。

我理解这个问题,因为您希望服务器找到客户端的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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM