【发布时间】:2016-12-07 16:14:16
【问题描述】:
我正在测试一个简单的套接字设置,其中服务器侦听指定端口,客户端发送该服务器应接收的广播数据包。
此设置在直接发送消息(即不广播)时可以正常工作,但在广播数据包时服务器永远不会收到。
部分代码(为简单起见,删减了错误检查):
// Client (broadcast sender)
// Create and bind the client socket
clientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(5678);
sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(clientSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr));
u_long uMode = 1;
ioctlsocket(clientSocket, FIONBIO, &uMode);
char broadcast = 1;
setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));
// ...
// Send the packet
sockaddr_in sockAddress;
sockAddress.sin_family = AF_INET;
sockAddress.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);
sockAddress.sin_port = htons(5679);
char const* pPacket = "Test";
size_t uPacketSize = strlen(pPacket) + 1;
sendto(clientSocket, pPacket, (int)uPacketSize, 0, (sockaddr*)&sockAddress, sizeof(sockAddress));
-
// Server (listener)
// Create and bind the server socket
serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(5679);
sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(serverSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr));
u_long uMode = 1;
ioctlsocket(serverSocket, FIONBIO, &uMode);
// ...
char pBuffer[1024];
while (true)
{
int iRecvSize = recv(serverSocket, pBuffer, 1024, 0);
if (iRecvSize)
{
printf("Received packet\n");
}
}
【问题讨论】:
-
您可能希望为更多功能添加错误检查,例如
setsockopt调用。 -
您还需要在要接收广播的套接字上设置
SO_BROADCAST选项。 -
@Someprogrammerdude 我在实际代码中确实有错误检查,我只是为这个问题删除了它。没有一个函数返回任何错误(除了偶尔出现的 WSAEWOULDBLOCK,这是非阻塞套接字的预期)。我想我确实尝试在接收器上设置 SO_BROADCAST,但我会再试一次,看看是否有帮助。
标签: c++ c udp winsock broadcasting