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

Sef*_*efu 4 c++ sockets windows port binding

我是Windows网络的新手,我试图找出我的套接字绑定到哪个PORT编号(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
Run Code Online (Sandbox Code Playgroud)

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

感谢您的帮助!我很感激.

Ada*_*eld 16

使用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
Run Code Online (Sandbox Code Playgroud)

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

  • "int local_port = sin.sin_port;" - > int local_port = ntohs(sin.sin_port); (2认同)