2011-05-13 71 views
0

我有一个C应用程序每隔几秒向UDP服务器发送一次数据。如果客户端丢失了几分钟的网络连接并重新连接,它会将所有累积的数据发送到服务器,这可能导致来自客户端的同时有数百个或更多的请求进入服务器。防止在网络连接不可用时发送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); 
+0

当你说“客户端失去了[原创]网络连接”,你的意思是说有人拔掉了插头或类似的东西? AFAIK connect()不会帮你;这只是一种便利,因此您不必在每次send()调用中指定目标地址。对于UDP,connect()不会触发任何网络活动,因为UDP未连接且不必交换段。 – 2011-05-13 13:05:12

回答

2

这听起来像你得到的行为是从数据报被缓冲在套接字sndbuf中,并且你希望这些数据报被丢弃,如果他们不能立即发送?

如果是这种情况,你可能有幸运行将sndbuf的大小设置为零。

警告词 - 这个行为区域听起来像是踩在非常接近“特定实施”的领土上。

0

至于解释here,来检索UDP错误发送给您之前应该使用connect,那么send方法,但在Linux上它似乎有或没有connect相同的行为。