从服务器接收多个 sendto()
Posted
技术标签:
【中文标题】从服务器接收多个 sendto()【英文标题】:Receiving multiple sendto() from servers 【发布时间】:2014-10-07 16:26:47 【问题描述】:我的客户端正在向子网上的所有服务器发送 UDP 广播。每个服务器都会回复客户端,以便客户端可以获取/存储服务器的 IP 地址。并非每次所有服务器都会收到消息(可能是因为 UDP?)。当找到服务器的新IP地址时,最好的方法是增加一个广播计数器吗?
另一个问题目前在客户端,一次只能收到一条消息。是否可以同时接收多条消息?
这是我的客户端代码:
if (recvfrom(Socket, receiveBuffer, BUFLEN, 0, (struct sockaddr *) &connectedSocket, &length) == SOCKET_ERROR)
printf("\nrecvfrom() failed with error code : %d" , WSAGetLastError());
closesocket(Socket);
WSACleanup();
exit(EXIT_FAILURE);
else
printf("\nServer Says : ");
printf("\n\nI am from %s:%d\n", inet_ntoa(connectedSocket.sin_addr), ntohs(connectedSocket.sin_port));
【问题讨论】:
【参考方案1】:发送广播后,启动计时器并让它运行 5-30 秒。在此期间,处理您收到的任何回复。当计时器结束时,停止处理任何回复,如果您碰巧收到它们,请丢弃它们。
不,UDP 套接字不能一次为您提供多个数据报,您必须单独读取它们。
【讨论】:
我要做的基本上是查询本地网络上的所有机器(运行服务器)。由于我一次只能收到 1 条消息,您如何看待检查它是否是新的 ip 地址,如果是,增加计数器(最初是 5 可以说)做 5?更多广播 我认为根本不需要使用计数器或多个广播。发送一个广播。如果您看到一个新 IP,请将其添加到您的列表中并继续。给自己一些时间来接收回复,它们可能不是即时的。仅仅因为您一次不能收到多条消息并不意味着 SOCKET 不能。它有一个内部接收缓冲区是有原因的。只要您的阅读速度足够快,缓冲区不会被填满,您就不会丢失回复。 只需将上面的 if (recvfrom..) 块放入无限循环中进行测试,我确实得到了所有回复!非常感谢您提供有关缓冲区的帮助和信息。以上是关于从服务器接收多个 sendto()的主要内容,如果未能解决你的问题,请参考以下文章