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;
}
奇怪的是,当服务器和客户端在同一台计算机上时,它可以工作,但当它们在两台不同的计算机上时,就不行了。
有人知道是什么原因造成的吗?以及如何修复它?
我发现了问题,防火墙出于某种原因阻止了我在专用网络中的程序。我现在已经启用了该程序并且它运行良好。
我有一个客户端等待服务器向特定端口发送广播,然后 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;
}
奇怪的是,当服务器和客户端在同一台计算机上时,它可以工作,但当它们在两台不同的计算机上时,就不行了。
有人知道是什么原因造成的吗?以及如何修复它?
我发现了问题,防火墙出于某种原因阻止了我在专用网络中的程序。我现在已经启用了该程序并且它运行良好。