gpt4 book ai didi

C - 来自文件描述符的公共(public) IP

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:11 25 4
gpt4 key购买 nike

我在三台不同的计算机上有三个进程。

进程 1,客户端,向进程 2 询问进程 3 的 IP 和端口。

进程3早先连接到进程2,进程2从文件描述符中获取进程3的IP(进程3已经知道进程2的ip和端口)。

这工作正常,但如果我尝试在同一台计算机上运行进程 2 和进程 3,进程 3 的 IP 始终是 127.0.0.1,因此进程 1 永远找不到进程 3。

    socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET_ADDRSTRLEN];

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

struct sockaddr_in *s = (struct sockaddr_in *) &addr;

inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);

这是我使用的代码,ipstr 是我得到的 IP。

我该如何解决这个问题?

非常感谢!

最佳答案

如果在 getpeername() 调用进程 3 套接字后,您检测到该地址是本地主机,您可以改为调用 getsockname()对于进程 1 套接字获取用于连接到进程 2 的 IP 进程 1。只要进程 3 在同一台机器上运行时正在监听与进程 2 相同的接口(interface),进程 1 就应该能够连接到进程3 具有相同的地址。

len = sizeof addr;
getpeername(p3_socket, (struct sockaddr*) &addr, &len);
struct sockaddr_in *s = (struct sockaddr_in *) &addr;
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);

if (strcmp(ipstr, "127.0.0.1") == 0) {
len = sizeof(addr);
getsockname(p1_socket, (struct sockaddr *)addr, &len);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
}

关于C - 来自文件描述符的公共(public) IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583052/

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