recv函数,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;
  }

Tags:  socket函数 recv函数

延伸阅读

最新评论

发表评论