请问一个socket编程问题(急!)

由于要收的包长度不知所以用循环方式来收
count = 0;
while( recvlen = recv ( sockfd , buff+count , 2048 , 0 ) )
{
if( recvlen <0 )
{
RunLog( logfile , "recv error [%d] [%d]\n",recvlen , errno );
return( -1 );
}

count += recvlen;
}
return (count);

对方发包长度为1980字节
第一次收到了1460字节,本来还应该收到520字节
但第一次成功收到了1460字节后第二次recv就返回-1了,errno是90
急问各位高手是什么原因。谢谢了!!
[424 byte] By [kodwim-易辉] at [2008-5-29]
# 1
用perror(strerror(errno))看一下出错信息
bao_zey-幽游白书 at 2007-10-22 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 2
90的错误为:
#define EMSGSIZE 90 /* Message too long */
你看看是否发送的包超过了你buf的范围
huangwu007-浪迹天涯 at 2007-10-22 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 3
这种情况下, 缓冲区长度至少超过 2048各字节才可以。
由于TCP“粘包”,所以或者你根据自己的协议取得长度,或者定义前导符。

还有, 取TCP缓冲区数据的长度可以用标志MSG_PEEK
recv(fd, pBuf, iBufLen, MSG_PEEK)
ylangin-Forest at 2007-10-22 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 4
缓冲区我定得很大的呀20480
kodwim-易辉 at 2007-10-22 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 5
怎么给分
kodwim-易辉 at 2007-10-22 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 6
你接收是多次循环的接收,但是发送的时候呢,一次将你的1980都发送过来了,你自己只是接受到其中的一部分,后面的自然就没有了。
# 7
点“管理”即可
huangwu007-浪迹天涯 at 2007-10-22 > top of Msdn China Tech,Linux/Unix社区,程序开发...
# 8
对方用的是什么机器呀?Linux中8039芯片驱动程序只支持大概小于1518,大于60个字节的数据包,不标准的包为统计错误。如果要大的包,可以分割接收,也可以修改内核源代码,我没试过,在drivers/net/9390.c中,其时这只是一个驱动程序的问题和内核没关系。也可能不是这个原因,我的水平有限,还没把内核吃透吧。
fghost-谬论专家 at 2007-10-22 > top of Msdn China Tech,Linux/Unix社区,程序开发...