如何解决Winsock 套接字不接收数据包 cpp
我有一个客户端,它等待服务器向特定端口发送广播,然后返回消息。
我可以在 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 举报,一经查实,本站将立刻删除。