gpt4 book ai didi

c++ - getpeername() 不适用于与本地主机的连接

转载 作者:行者123 更新时间:2023-11-28 03:59:48 25 4
gpt4 key购买 nike

编辑:重申问题,如果我正在监听端口 54321 并且监听端口 12345 的本地进程连接到我,创建套接字 s,我如何真正找到它正在监听的端口?

sockaddr_in addr;
int len = sizeof(addr);
getpeername(s, (sockaddr*)&addr, &len);
cout << string(inet_ntoa(addr.sin_addr)) << ":" << ntohs(addr.sin_port) << endl;

输出不应该是 127.0.0.1:12345 吗?相反,我得到 127.0.0.1:62305 或其他一些任意端口号。这是我的错误,还是应该这样?

最佳答案

看起来您有两个进程在两个端口上监听 - 这是两个相互独立的监听套接字。然后在其中一个进程中创建第三个客户端套接字并连接到另一个进程。第三个套接字得到一个 ephemeral port由 TCP 堆栈分配给它(在您的情况下为 62305)。所以连接由元组{source ip, source port, target ip, target port} - {127.0.0.1,62305,127.0.0.1,54321}表示。此连接与连接进程可能具有的任何监听套接字完全无关。如果您需要知道它们,您必须明确设计您的应用程序以在对等点之间传递端口号。如果你只是想知道什么进程有什么套接字,总是有 lsof .

关于c++ - getpeername() 不适用于与本地主机的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1436374/

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