微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Winsock 套接字不接收数据包 cpp

如何解决Winsock 套接字不接收数据包 cpp

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

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

packet on 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,SO_broADCAST,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,&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(),sizeof(recvAddr)) <= 0)
        std::cout << "Send error <" << WSAGetLastError() << ">" << std::endl;


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

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

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。