编辑:重复这个问题,如果我正在侦听端口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或其他任意的端口号。这是我的错误,还是应该是这样的?
发布于 2009-09-17 13:14:25
看起来你有两个进程在监听两个端口--也就是两个相互独立的监听套接字。然后,在其中一个进程中创建第三个客户端套接字,并连接到另一个进程。第三个套接字通过TCP stack (在您的示例中是62305)分配给它一个ephemeral port。因此连接由元组{源ip,源端口,目标ip,目标端口}- {127.0.0.1,62305,127.0.0.1,54321}表示。此连接与连接进程可能具有的任何侦听套接字完全无关。如果您需要知道端口号,您必须显式地设计您的应用程序以在对等方之间通信端口号。如果你只想知道哪个进程有什么套接字,总会有lsof。
发布于 2009-09-17 02:10:14
为了详细说明RageZ的答案,getpeername()返回源端口和套接字另一端的地址。端口12345是您传递给bind()的目标地址。一般而言,客户端(例如telnet、nc等)不会在套接字上调用bind(),因为它们不想侦听连接。因此,操作系统将为它们分配一个任意的“临时”端口号。
通常,在知道TCP连接的源端口方面几乎没有什么用处。
发布于 2009-09-17 02:01:37
getpeername给出了客户端的详细信息,而不是服务器的详细信息,所以你可以得到一些随机的端口。
您可以看到man页面
干杯
https://stackoverflow.com/questions/1436374
复制相似问题