//方法一
char sendbuff[2048];
int nBytes = 2048;//一些初始化代码ret = send(s, sendbuff, nBytes, 0);/***************************************************///方法二
char sendbuff[2048];
int nBytes = 2048;
int nLeft = nBytes;
int idx = 0;//一些初始化代码while(nLeft > 0) {
   ret = send(s, &sendbuff[idx], nLeft, 0);
   if (ret == SOCKET_ERROR) {
      //错误处理
   }   nLeft -= ret;
   idx += ret;
}

解决方案 »

  1.   

    有啥不同吗?
    这么做,没有必要吧。你可以在第二个循环里面,打印个log,看它执行了几次。
    这个和缓冲区不知道有没有关系,我也不是太清楚了。send的时候,那个len是有效长度,像你那样的话,如果buffer不满,他会发送乱码到另一端的。
      

  2.   

    第二种对,因为send函数调用成功时,其返回值表示实际发送的字节数。
      

  3.   

    第二次是从此前发送的字节后面那个字节开始发送的,
    &sendbuff[idx]就是在计算新位置。
    这不是“没用必要”的问题,而是必须这么做!你一次发送1万字节,如果循环不停发送,必然丢了很多报文看看这个:http://blog.vckbase.com/arong/archive/2010/01/03/40672.html
      

  4.   

    http://blog.vckbase.com/arong/archive/2010/01/03/40672.html
    这个教程里面的,并没有send的实际原理解释,只是那么说了,究竟为什么是那样?啥时候会产生发不全的情况,都没有说明。这个我以前没有仔细看过tcp的发送模式,不知道这个每次能够放入socket缓冲区中的字节数,和这个返回值有啥关系。
    我想:这个send的返回值应该指的就是放入socket缓冲区中的字节数吧。
    如果缓冲区满的话,会不会出现没有全部放入的情况?
      

  5.   

    同意 10 楼。一般用 1 即可。对常见的TCP实现,send都是将数据放到缓冲区,
    如果本次放不完(即返回值<指定值),下次循环也不会放入(EWOULDBLOCK)。
    但也有可能在两次send之间,系统收到对方新的确认而释放缓冲区,但机会不大。