windows socket编程中send与recv函数的收发数据不一致问题

这几天在使用windows的socket编程去做文件的传输,发现这个windows下的socket编程也真和以前接触过的java和C#的有很多的不同,有异步的模型也有同步的模型,为了简单起见我还是使用了同步阻塞模型,没想到这个阻塞也还不是想象中的阻塞,以前使用send发送完数据后,recv就会把数据都接完,调试了很久,发现recv老是接收的数据比send的要少,上网查了一下,大概明白recv就是只要socket的接收缓冲区一有数据就会返回,不过还是会尽量多地接收用户缓冲区所指定大小的数据。因为我是将一个文件分为若干块进行传输,因此只有在接受端每接收文件的一块都使用一个循环直到recv到指定的块大小后在写入文件,代码如下:

  Packet pack;

  int nRecv = 0;
  while (nRecv != sizeof(pack))
  {
   int tmp = ::recv(s, (char*)&pack + nRecv, sizeof(pack) - nRecv, 0);
   if (tmp == 0 || tmp == SOCKET_ERROR)
   {
    if (flog)
    {
     fprintf(flog, "数据接收错误!/n");
     fflush(flog);
    }
    printf("数据接收错误!/n");
    break;
   }
   nRecv += tmp;
  }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值