【问题标题】:Prevent UDP data from being sent when network connection is unavailable防止网络连接不可用时发送 UDP 数据
【发布时间】:2011-05-13 12:58:42
【问题描述】:

我有一个 C 应用程序,它每隔几秒就向 UDP 服务器发送数据。如果客户端在几分钟内失去了网络连接,然后又恢复了连接,它会将所有累积的数据发送到服务器,这可能导致该客户端同时进入服务器的一百个或更多请求。

如果在使用 UDP 传输过程中发生错误,是否有任何方法可以防止这些消息从客户端发送?来自 UDP 客户端的 connect 调用是否有助于确定客户端是否可以连接到服务器?还是只有使用 TCP 才能做到这一点?

int socketDescriptor; 
struct sockaddr_in serverAddress;

if ((socketDescriptor = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
    printf("Could not create socket. \n");
    return;
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = inet_addr(server_ip);
serverAddress.sin_port = htons(server_port);

if (sendto(socketDescriptor, data, strlen(data), 0, 
                  (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0)
{  
   printf("Could not send data to the server. \n");
   return;
}

close(socketDescriptor);

【问题讨论】:

  • 当你说“客户端失去它的[原文如此] 网络连接”时,你的意思是有人拔掉了插头或类似的东西吗? AFAIK connect() 不会帮助你;这只是一种方便,因此您不必在每个 send() 调用中指定目标地址。使用 UDP,connect() 不会触发任何网络活动,因为 UDP 未连接且无需交换任何段。

标签: c udp


【解决方案1】:

听起来您得到的行为是来自在套接字 sndbuf 中缓冲的数据报,如果不能立即发送这些数据报,您希望将其丢弃?

如果是这种情况,您可能会幸运地将 sndbuf 的大小设置为零。

警告 - 这个行为领域听起来非常接近“特定于实施”的领域。

【讨论】:

    【解决方案2】:

    正如 here 解释的那样,要检索 UDP 发送上的错误,您应该先使用 connect,然后使用 send 方法,但在 Linux 上,无论是否使用 connect,它似乎都有相同的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      相关资源
      最近更新 更多