的recv会返回。如果您请求100个字节,它不会等到有100个字节。
如果您要发送100字节的“消息”,请记住,TCP不提供的消息,它只是流。如果您正在处理应用程序消息,则需要在应用程序层处理该消息,因为TCP不会这样做。
有其中的100个字节的发送()调用可能还没有完全在另一端调用时只有一个recv调用的recv(...,100)读很多很多的条件;这里只是一个几个例子:
发送TCP堆栈决定束15个写入调用在一起,MTU正好是1460,这 - 这取决于到达的数据的时序可能导致前14个客户端调用获取100个字节,调用15.获取60个字节 - 最后40个字节将在下一次调用recv()时出现。(但是如果你用100的缓冲区调用recv,你可能会得到前一个应用程序的最后40个字节“消息”和下一个消息的前60个字节)
发送缓冲区已满,也许读者速度缓慢,或者网络拥塞。在某些时候,数据可能会通过,同时清空缓冲区,最后一块数据不是100的倍数。
接收缓冲区已满,而您的应用程序recv()该数据,最后一个块因为该消息的整个100个字节不适合缓冲区,所以拉起仅仅是部分的。
许多场景都比较难以测试,特别是在一个局域网里,你可能不会有很多拥塞或包丢失的 - 当你上升和下降的速度,发送消息的事情可能会有所不同/生产。
无论如何。如果你想从一个套接字读取100个字节,使用类似
int
readn(int f, void *av, int n)
{
char *a;
int m, t;
a = av;
t = 0;
while(t < n){
m = read(f, a+t, n-t);
if(m <= 0){
if(t == 0)
return m;
break;
}
t += m;
}
return t;
}
...
if(readn(mysocket,buffer,BUFFER_SZ) != BUFFER_SZ) {
//something really bad is going on.
}
来源
2010-02-19 12:39:27
nos
感谢您的详细解释。只需确认是否对* blocking * recv()调用也是如此? (即recv()返回的请求字节数小于) – Adil 2010-02-19 13:03:31
是的,这对阻塞recv呼叫是正确的。 – nos 2010-02-19 18:25:32