C 防止在网络连接不可用时发送UDP数据

C 防止在网络连接不可用时发送UDP数据,c,udp,C,Udp,我有一个C应用程序,它每隔几秒钟向UDP服务器发送数据。如果客户端在几分钟内失去网络连接,然后恢复连接,它会将所有累积的数据发送到服务器,这可能导致该客户端同时向服务器发送100个或更多请求 如果在使用UDP传输过程中发生错误,是否有任何方法防止这些消息从客户端发送?UDP客户端的connect调用是否有助于确定客户端是否可以连接到服务器?或者,这只能通过TCP实现吗 int socketDescriptor; struct sockaddr_in serverAddress; if ((s

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

如果在使用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);
intsocketdescriptor;
serverAddress中的结构sockaddr_;
if((socketDescriptor=socket(AF_INET,SOCK_DGRAM,0))<0)
{
printf(“无法创建套接字。\n”);
返回;
}
serverAddress.sin_family=AF_INET;
serverAddress.sin\u addr.s\u addr=inet\u addr(服务器ip);
serverAddress.sin\u port=htons(服务器\u端口);
如果(发送到)socketDescriptor,数据,strlen(数据),0,
(struct sockaddr*)&serverAddress,sizeof(serverAddress))<0)
{  
printf(“无法向服务器发送数据。\n”);
返回;
}
关闭(socketDescriptor);

如前所述,要检索UDP发送上的错误,您应该先使用
连接
,然后使用
发送
方法,但在Linux上,无论是否使用
连接
它似乎都有相同的行为。听起来,您得到的行为似乎来自套接字sndbuf中缓冲的数据报,如果这些数据报不能立即发送,你会更愿意丢弃它们吗

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

警告——这一行为领域听起来非常接近于“特定于实现的”领域。

当你说“客户端失去了它的[sic]网络连接”时,你的意思是有人拔了插头还是类似的?AFAIK connect()对您没有帮助;这只是一种方便,不必在每次send()调用中指定目标地址。对于UDP,connect()不会触发任何网络活动,因为UDP未连接,并且不需要交换任何段。