我正在学习插座。我正在编写一个简单的UDP服务器,通过它发送小消息。所有活动客户端每三分钟发送一次“keepalive”消息,以便服务器可以看到哪些客户端在线。
这些消息在流
中收到流功能:
void keepAlive(SOCKET udp)
{
int len=0;
while(true)
{
int len=recvfrom(udp,requestBuffer,maxMessage,0,(sockaddr*)&cliAddr,&cliAddrSize)
// Actions with the received message
}
}
但是,如果套接字已经“忙”,如何实现向所有客户端或特定客户端传输消息。需要创建一个新的套接字来发送消息? (在服务器上和客户端上)?如果客户端在NAT后面?
同样的问题也在客户端(因为keepalive被带到了线程,但是在解决这个问题时,另一个也正在解决)
答案 0 :(得分:0)
服务器收到keepalive消息后,您已经在cliAddr中获得了客户端地址。 然后,您可以使用sendto函数向客户端发送内容。 如果你想使用其他套接字,你可以做到。 如果客户端在NAT后面? 这没关系。如果服务器获得了WAN地址,路由器会将LAN中的IP地址和端口转换为WAN地址和端口。您在服务器中获得的客户端地址是WAN地址和端口。 WAN(地址和端口) - 映射 - LAN(地址和端口)。
在客户端我建议你创建一个线程来收集消息并处理它们(包括keepalive消息或其他类型)。