Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在短时间内缓冲UDP数据包_Linux_Sockets_Networking_Udp - Fatal编程技术网

Linux 在短时间内缓冲UDP数据包

Linux 在短时间内缓冲UDP数据包,linux,sockets,networking,udp,Linux,Sockets,Networking,Udp,我遇到的情况是Linux客户端正在使用UDP套接字。客户端正在发送消息,如果在10秒内没有响应,客户端将在10秒内重试 这种情况是,当连接断开时,许多测试都是从客户端发送的,同时服务器端没有收到任何内容。一旦连接启动,我发现服务器上所有以前的消息都是在同一时刻接收的,这意味着它被缓冲了,这会导致很多问题,因为在服务器端的同一时刻接收到重复的消息 客户端上的TCPDUMP: 21:01:14.691903 IP 172.123.13211 > 172.34.13211: length 88

我遇到的情况是Linux客户端正在使用UDP套接字。客户端正在发送消息,如果在10秒内没有响应,客户端将在10秒内重试

这种情况是,当连接断开时,许多测试都是从客户端发送的,同时服务器端没有收到任何内容。一旦连接启动,我发现服务器上所有以前的消息都是在同一时刻接收的,这意味着它被缓冲了,这会导致很多问题,因为在服务器端的同一时刻接收到重复的消息

客户端上的TCPDUMP:

21:01:14.691903 IP 172.123.13211 > 172.34.13211: length 88  "1st at second 14"  
21:01:24.692791 IP 172.123.13211 > 172.34.13211: length 88  "2nd at second 24"  
21:01:34.694930 IP 172.123.13211 > 172.34.13211: length 88  "3rd at second 34"  
21:01:44.696020 IP 172.123.13211 > 172.34.13211: length 88  "4th  ate second 44"   
一旦连接启动,服务器TCPDUMP:

12:02:01.509518 IP 172.123.13211 > 13211: length 88 "Received 1st at second 1"       
12:02:01.517841 IP 172.123.13211 > 13211: length 88 "Received 2nd at second 1"    
12:02:01.543759 IP 172.123.13211 > 13211  length 88 "Received 3rd at second 1"    
12:02:01.550741 IP 13211 > 172.123.13211: length 36   
12:02:01.567948 IP 172.123.13211 > .13211: length 88
我需要了解的情况下,UDP套接字被使用和连接是关闭的。 如何避免在数据包短缺时缓冲数据包

<>客户端代码在C++中
谢谢你

你可能正在寻找这个:


你在问题中使用的语言也是错误的。请更清楚、准确地使用相关术语

“使用UDP连接”和“一旦连接打开”和“连接关闭”没有任何意义。没有UDP连接。你在问题中说过。没有必要只是重复。UDP编程的一部分是处理重复消息;这些情况也可能发生在其他场景中,因此,即使您解决了此问题,您仍然希望优雅地处理重复项。处理它们的一种简单(ish)方法是,只需将传入的UDP数据包插入一个键控数据结构,该数据结构基于一个对任何重复数据包都相同的键(例如,源IP地址?),然后,仅当您读取了整个数据包积压中的数据包时,在数据结构上迭代,处理它持有的数据包,并清除它。@JeremyFriesner,是的,服务器可以处理重复的消息,但服务器抱怨他在同一时刻多次收到消息,并且他们说他们从未得到任何客户端的相同行为,即使所有客户端都在使用UDP。当我试图关闭套接字时,数据被清除,但我需要另一种方法来清除套接字上的缓冲数据而不关闭它。谢谢你,你不能马上清除它,但是你可以通过setsockopt(sou SNDBUF)减小它的大小;这将减少问题,也许是Hank yash,问题是客户端正在向服务器发送数据包,但由于连接中断,服务器没有接收到任何数据包,一旦连接断开,我发现所有缓冲数据包都同时被接收。我已经检查了这个链接,我相信清除缓冲区应该在服务器端而不是客户端端进行,对吗?如果你在C中实现这个,那么你为sEntoto()函数设置了什么标志?客户端代码是在C++ int UDPoSosi::sOtoto(空洞*数据,int长度,const INETAdvess和x Read Tead地址)const。{int writeLength;do{writeLength=sendto(handle,(char*)_data,_length,0,(struct sockaddr*)和_remoteAddress,sizeof(_remoteAddress));}而(writeLength<0&&LastError()==EAGAIN);if(writeLength<0){抛出SocketException(lasterrorstext());}返回writeLength;}当连接启动并且您开始接收包时,客户端程序是否仍在运行?是的,客户端已启动