Windows 调用Winsock绑定始终会更改本地端口,并且不会失败

Windows 调用Winsock绑定始终会更改本地端口,并且不会失败,windows,sockets,tcp,tcpclient,winsock2,Windows,Sockets,Tcp,Tcpclient,Winsock2,最近在一个测试服务器中,我注意到对bind()函数的调用,以及对任何特定端口的调用,总是更改所需的端口,并且从不失败。 在其他服务器中,一切正常, 下面是我使用的示例代码 iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != NO_ERROR) { wprintf(L"Error at WSAStartup()\n"); return 1; } ListenSocket = socket(AF_IN

最近在一个测试服务器中,我注意到对bind()函数的调用,以及对任何特定端口的调用,总是更改所需的端口,并且从不失败。 在其他服务器中,一切正常,
下面是我使用的示例代码

iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
    wprintf(L"Error at WSAStartup()\n");
    return 1;
}

ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
    wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
    WSACleanup();
    return 1;
}

service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("10.10.1.118");
service.sin_port = htons(27500);

iResult = bind(ListenSocket, (SOCKADDR *)&service, sizeof(service));
if (iResult == SOCKET_ERROR) {
    wprintf(L"bind failed with error %u\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}
else
    wprintf(L"bind returned success %i \n", ntohs(service.sin_port));

if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
    wprintf(L"listen function failed with error: %d\n", WSAGetLastError());

struct sockaddr_in sin;
int addrlen = sizeof(sin);
if (getsockname(ListenSocket, (struct sockaddr *)&sin, &addrlen) == 0 &&
    sin.sin_family == AF_INET &&
    addrlen == sizeof(sin))
{
    int local_port = ntohs(sin.sin_port);
}
wprintf(L"Binding on socket...%d\n", ntohs(sin.sin_port));
每次获得的端口与请求端口不同(27500)。 我使用TCPView检查了侦听端口是否确实是由bind任意分配的端口


有没有关于是什么导致这种行为的建议?

有些防火墙不是这样工作的吗?连接被重定向到防火墙进程,该进程监听所需端口?检查是否有其他进程正在该端口上侦听。嗨,克里斯。服务器中没有活动防火墙,防病毒软件也已被禁用。我忘了提到服务器是Hyper-V基础架构上的虚拟服务器