//方法一
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;
}
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;
}
这么做,没有必要吧。你可以在第二个循环里面,打印个log,看它执行了几次。
这个和缓冲区不知道有没有关系,我也不是太清楚了。send的时候,那个len是有效长度,像你那样的话,如果buffer不满,他会发送乱码到另一端的。
&sendbuff[idx]就是在计算新位置。
这不是“没用必要”的问题,而是必须这么做!你一次发送1万字节,如果循环不停发送,必然丢了很多报文看看这个:http://blog.vckbase.com/arong/archive/2010/01/03/40672.html
这个教程里面的,并没有send的实际原理解释,只是那么说了,究竟为什么是那样?啥时候会产生发不全的情况,都没有说明。这个我以前没有仔细看过tcp的发送模式,不知道这个每次能够放入socket缓冲区中的字节数,和这个返回值有啥关系。
我想:这个send的返回值应该指的就是放入socket缓冲区中的字节数吧。
如果缓冲区满的话,会不会出现没有全部放入的情况?
如果本次放不完(即返回值<指定值),下次循环也不会放入(EWOULDBLOCK)。
但也有可能在两次send之间,系统收到对方新的确认而释放缓冲区,但机会不大。