udp 接受数据不完整,如何解决? sniffer抓包,数据全部到达?
下面是本人写的客户端接收数据的代码,没有问题。程序情况如下:
服务器发送10M的数据,
客户端可以接收到前面大概1M 的数据然后就阻塞在recvfrom();
请问如何解决这种问题?
数据是局域网传输,本人用的是千兆网,网络畅通。
曾经测试过如果服务器发送完数据后等待一会,客户端可以接收到更多的数据。
希望大家有更好的解决办法?
fd_set fdRead;fd_set fdSocket;FD_ZERO(&fdSocket);// FD_SET(socket, &fdSocket);FD_SET(datasocket, &fdSocket);timeval timeout;timeout.tv_sec = RESPONSETIME;//RESPONSETIME = 2while (true){fdRead = fdSocket;int nRet = ::select(0, &fdRead, NULL, NULL, &timeout);if(nRet >0){for(int i = 0; i<(int)fdSocket.fd_count; i++){if (FD_ISSET(datasocket, &fdRead)){if (fdSocket.fd_array[i] == datasocket){::recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);do {memset(recvimagedata, 0, RECVBUFFER);recvlen = ::recvfrom(datasocket, recvimagedata, RECVBUFFER, 0, (sockaddr *)&RecvAddr, &n);if(recvlen >8)memcpy_s(psave, imagebuffersize, (recvimagedata + 8), recvlen - 8);imagebuffersize -= recvlen;psave += recvlen;} while (imagebuffersize > 0);::recvfrom(datasocket, CommandData, sizeof(CommandData), 0, (sockaddr *)&RecvAddr, &n);}}}}}int size = 1024*256;setsockopt(m_ServerSock,SOL_SOCKET,SO_RCVBUF,(const char*)&size,sizeof(int));setsockopt(m_ServerSock,SOL_SOCKET,SO_SNDBUF,(const char*)&size,sizeof(int));
[解决办法]
服务器发送数据太快,导致接收端的socket系统缓冲区快速充满,这样的结果是导致后续的数据丢失?
[解决办法]
sniffer看到"数据到达"是底层,到达以后需要从网卡取出,放入缓冲区。如果缓冲区满,是不会等待上层取数据而导致缓冲区有空的,而是直接丢弃。
接收是应该很快的,看你接取数据之后的处理是否费时。因为网络快,而你的服务器又没有流控,所以很可能就是接收处理的速度赶不上发送的速度。
"服务器关闭连接"是TCP的概念。UDP不是面向连接的,是面向数据报。TCP会做流控,使服务器慢点发,让客户端有事件处理。
看你的需求是什么,也许该改用TCP,也许应该自己在UDP上做流控。
[解决办法]