如何找到套接字的本地端口号? (Windows C++)

Posted

技术标签:

【中文标题】如何找到套接字的本地端口号? (Windows C++)【英文标题】:How to find a socket's local port number? (Windows C++) 【发布时间】:2011-10-03 08:14:44 【问题描述】:

我是 Windows 网络的新手,我正在尝试找出我的套接字绑定到的端口号(C++、Windows 7、Visual Studio 2010 Professional)。它是一个 UDP 套接字,据我了解,使用以下初始设置应将其绑定到随机可用端口/地址:

sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = 0; //randomly selected port
int result = bind(clientSock, (sockaddr*)&local, sizeof(local));
//result is always 0

就使用此方法而言,它适用于发送数据或将其绑定到特定端口(将 0 替换为所需的端口号)。我需要的是随机绑定它,然后找出它绑定到哪个端口。有什么办法可以做到这一点吗?似乎“本地”结构包含“0.0.0.0”作为 IP 地址和“0”作为端口号。

感谢您的任何帮助!我很感激。

【问题讨论】:

re:为什么不生成一个随机端口——因为该随机端口可能已经被其他程序或服务使用了。 @MerlynMorgan-Graham 为什么不让系统完全做到这一点,这是它默认已经做的,没有它被使用的风险,然后使用提供的 API 来查找知道它是什么? 【参考方案1】:

使用getsockname。例如:

struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(clientSock, (struct sockaddr *)&sin, &addrlen) == 0 &&
   sin.sin_family == AF_INET &&
   addrlen == sizeof(sin))

    int local_port = ntohs(sin.sin_port);

else
    ; // handle error

这也适用于基于 *nix 的系统,但请注意,某些系统将 getsockname 的第三个参数定义为 socklen_t* 类型而不是 int*,因此您可能会收到有关指针不同符号的警告,如果您正在编写跨平台代码。

【讨论】:

"int local_port = sin.sin_port;" --> int local_port = ntohs(sin.sin_port); 谢谢,这对我有用。感谢您的帮助。

以上是关于如何找到套接字的本地端口号? (Windows C++)的主要内容,如果未能解决你的问题,请参考以下文章

套接字

sockt套接字编程

在Windows 7里,哪些字属于套接字?

socket中的虚拟端口号port

多用户 Windows 服务器上的端口号处理

常用tcp和udp重要协议端口号