首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >getpeername()不适用于与本地主机的连接

getpeername()不适用于与本地主机的连接
EN

Stack Overflow用户
提问于 2009-09-17 01:57:32
回答 4查看 1.7K关注 0票数 0

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

代码语言:javascript
运行
复制
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或其他任意的端口号。这是我的错误,还是应该是这样的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-17 13:14:25

看起来你有两个进程在监听两个端口--也就是两个相互独立的监听套接字。然后,在其中一个进程中创建第三个客户端套接字,并连接到另一个进程。第三个套接字通过TCP stack (在您的示例中是62305)分配给它一个ephemeral port。因此连接由元组{源ip,源端口,目标ip,目标端口}- {127.0.0.1,62305,127.0.0.1,54321}表示。此连接与连接进程可能具有的任何侦听套接字完全无关。如果您需要知道端口号,您必须显式地设计您的应用程序以在对等方之间通信端口号。如果你只想知道哪个进程有什么套接字,总会有lsof

票数 1
EN

Stack Overflow用户

发布于 2009-09-17 02:10:14

为了详细说明RageZ的答案,getpeername()返回端口和套接字另一端的地址。端口12345是您传递给bind()的目标地址。一般而言,客户端(例如telnet、nc等)不会在套接字上调用bind(),因为它们不想侦听连接。因此,操作系统将为它们分配一个任意的“临时”端口号。

通常,在知道TCP连接的源端口方面几乎没有什么用处。

票数 1
EN

Stack Overflow用户

发布于 2009-09-17 02:01:37

getpeername给出了客户端的详细信息,而不是服务器的详细信息,所以你可以得到一些随机的端口。

您可以看到man页面

干杯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1436374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档