recv接收数据不完整? 但wireshark抓包看到的数据是和服务端发出来的一致的

萧山夜雨 2015-07-20 06:16:58
//客户端代码

DWORD WINAPI TcpRecvProc(void *pVoid)
{
struct timeval tv = {0, 300*1000};
fd_set rfds;
char *buf = new char[MAX_VIDEO_FRAME_LEN];

int cnt=0;
while (g_RunThread)
{
FD_ZERO(&rfds);
FD_SET(g_fd, &rfds);

int ret = select((int)g_fd+1, &rfds, NULL, NULL, &tv);
if (GetLastError()!=0)
TRACE("GetLastError=%d\n", GetLastError()); //未输出错误
if (ret<0)
Sleep(100);
else if (ret==0)
Sleep(100);
else
{
int n = recv(g_fd, buf, MAX_VIDEO_FRAME_LEN/4, 0);
if (n<=0)
{
if (GetLastError()!=0)
TRACE("GetLastError=%d\n", GetLastError());//未输出错误
continue;
}
cnt+=n;
TRACE("%d\n", cnt);

//一些业务处理代码 ...
}
}

//服务端输出
write errno=104, n=147533, fd=9, cmd=80,subcmd=80
write errno=104, n=116775, fd=9, cmd=80,subcmd=80
write errno=104, n=138693, fd=9, cmd=80,subcmd=80
write errno=104, n=144560, fd=9, cmd=80,subcmd=80
write errno=104, n=130876, fd=9, cmd=80,subcmd=80
write errno=104, n=126041, fd=9, cmd=80,subcmd=80
write errno=104, n=54170, fd=9, cmd=80,subcmd=80
write errno=104, n=21303, fd=9, cmd=80,subcmd=80
write errno=104, n=12842, fd=9, cmd=80,subcmd=80
write errno=104, n=11703, fd=9, cmd=80,subcmd=80
//wireshark的FollowTcpStream显示Entire conversation 904496,和服务端输出累加一致,不知道客户端为什么收不全?
...全文
918 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TonyZhaaang 2017-02-11
  • 打赏
  • 举报
回复
楼主可以尝试用setsockopt扩大缓冲区
hslinux 2015-07-28
  • 打赏
  • 举报
回复
跟三楼意见一致,建议数据接收与数据处理分别用不同线程来进行。这时需要注意数据缓冲区互斥访问。 LZ可以先把业务逻辑屏蔽了,单纯测试下网络收包问题。
xian_wwq 2015-07-28
  • 打赏
  • 举报
回复
个人建议把数据接收和数据处理分离 也就是在数据接收线程中不要进行数据解析、业务处理 否则往往会导致处理超时,socket自动断开
翅膀又硬了 2015-07-28
  • 打赏
  • 举报
回复
你为什么接收  MAX_VIDEO_FRAME_LEN/4 ?尽管这不会造成错误
zilaishuichina 2015-07-27
  • 打赏
  • 举报
回复
你确定不是因为没有发完就关闭了socket? 或者是你的“//一些业务处理代码 ...”中间出的问题导致的没有再循环下去?
萧山夜雨 2015-07-20
  • 打赏
  • 举报
回复
补充一下,这个时候服务端数据发送处于暂停状态,客户端的select和recv再也没有数据过来了,大概只收到了800多K

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧