Winsock 套接字不接收数据包 cpp

Winsock socket doesn't recveive packet cpp

我有一个客户端等待服务器向特定端口发送广播,然后 return 一条消息。

我可以在 Wireshark 中看到数据包,但我的应用程序没有捕捉到它。

这是捕获数据包的函数。 (getPrivateIP 有效)

uint32_t findMastersIP()
{
    sockaddr_in recvAddr{};
    sockaddr_in sendAddr{};

    SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s == INVALID_SOCKET)
        std::cout << "Socket error <" << WSAGetLastError() << ">" << std::endl;
    
    int opt;

    std::string message, response;
    char* buf = new char[65536];
    int fromlen;

    recvAddr.sin_addr.s_addr = getPrivateIP();
    recvAddr.sin_port = htons(667);
    recvAddr.sin_family = AF_INET;

    fromlen = sizeof(recvAddr);

    opt = 1;
    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt))<0)
        std::cout << "Sockopt error <" << WSAGetLastError() << ">" << std::endl;

    if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(opt)) < 0)
        std::cout << "Sockopt error <" << WSAGetLastError() << ">" << std::endl;

    if(bind(s, (sockaddr*)&recvAddr, sizeof recvAddr) < 0)
        std::cout << "Bind error <" << WSAGetLastError() << ">" << std::endl;

    /*fixed messages for my "protocol"*/
    message = "What is your IP?";
    response = "My IP";

    /*wait for the master to ask me to connect*/
    do {
        ZeroMemory(buf, 65536);
        if(recvfrom(s, buf, 65536, 0, (sockaddr*)&recvAddr, &fromlen) <= 0)
        {
            std::cout << "Recieve error <" << WSAGetLastError() << ">" << std::endl;
            goto errorLable;
        }
        std::cout << buf << std::endl;
    } while (!std::string(buf)._Equal(message));

    if(sendto(s, response.c_str(), response.size(), 0, (sockaddr*)&recvAddr, sizeof(recvAddr)) <= 0)
        std::cout << "Send error <" << WSAGetLastError() << ">" << std::endl;


errorLable:
    delete[] buf;
    closesocket(s);
    return recvAddr.sin_addr.s_addr;
}

奇怪的是,当服务器和客户端在同一台计算机上时,它可以工作,但当它们在两台不同的计算机上时,就不行了。

有人知道是什么原因造成的吗?以及如何修复它?

我发现了问题,防火墙出于某种原因阻止了我在专用网络中的程序。我现在已经启用了该程序并且它运行良好。