gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:27:56 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

关于c - 如何找出通过 TCP 连接的给定进程的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29566340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com