socket read返回问题

假设read一个socket,参数为100,read(socketfd, buf, 100),对方假设发送了80字节数据,但是现在socket接收缓冲区里只收到了20字节数据,问这个时候,read是否会返回20字节呢,还是继续阻塞等到剩余的60字节?

作者: MagicxiaoZ   发布时间: 2011-05-19

tcp的发送是没有数据边界的,一次发送100个字节,有可能一次接受100个字节,也有可能100次,一次接受1个字节。
接受多少,返回值就多少
所以,TCP接受要一直等到没有数据为止

作者: Harry_lyc   发布时间: 2011-05-19

引用 1 楼 harry_lyc 的回复:

tcp的发送是没有数据边界的,一次发送100个字节,有可能一次接受100个字节,也有可能100次,一次接受1个字节。
接受多少,返回值就多少
所以,TCP接受要一直等到没有数据为止


就是说继续阻塞等待剩下的80字节数据?
那接收端凭什么知道还有80字节数据没有到啊?

作者: MagicxiaoZ   发布时间: 2011-05-19

引用 2 楼 magicxiaoz 的回复:

引用 1 楼 harry_lyc 的回复:

tcp的发送是没有数据边界的,一次发送100个字节,有可能一次接受100个字节,也有可能100次,一次接受1个字节。
接受多少,返回值就多少
所以,TCP接受要一直等到没有数据为止


就是说继续阻塞等待剩下的80字节数据?
那接收端凭什么知道还有80字节数据没有到啊?


说错了,通过什么判断出还有60字节数据没有到呢?
谢谢诸位//

作者: MagicxiaoZ   发布时间: 2011-05-19

所以用TCP的自己定义的消息需要加一个头,定义自己的消息体长度是多少,来判断还有多少数据没有收完。
引用 3 楼 magicxiaoz 的回复:

引用 2 楼 magicxiaoz 的回复:

引用 1 楼 harry_lyc 的回复:

tcp的发送是没有数据边界的,一次发送100个字节,有可能一次接受100个字节,也有可能100次,一次接受1个字节。
接受多少,返回值就多少
所以,TCP接受要一直等到没有数据为止


就是说继续阻塞等待剩下的80字节数据?
那接收端凭什么知道还有80字节数据没有到啊?


说……

作者: guosha   发布时间: 2011-05-19

socket底层的TCP/IP就是用来保证能接收到一条完整的数据的, 不论是TCP还是UDP, 数据接收完了才会通知socket进行下一步动作, Qt的socket就是这样设计的, 其他的平台不太懂,估计差不多吧。

作者: ilyz5609   发布时间: 2011-05-19

就事论事的话,是1.read马上返回20字节呢?还是2.继续阻塞等待呢?
如果是阻塞等待的话,凭什么知道还有没收到的数据呢?
谢谢

引用 4 楼 guosha 的回复:

所以用TCP的自己定义的消息需要加一个头,定义自己的消息体长度是多少,来判断还有多少数据没有收完。
引用 3 楼 magicxiaoz 的回复:

引用 2 楼 magicxiaoz 的回复:

引用 1 楼 harry_lyc 的回复:

tcp的发送是没有数据边界的,一次发送100个字节,有可能一次接受100个字节,也有可能100次,一次接受1个字节。
接受多少,返回值就多少……

作者: MagicxiaoZ   发布时间: 2011-05-19

while(read(...))
{
  //数据放入缓冲区
}
直到while结束循环,可以认为一个接受完成了

作者: Harry_lyc   发布时间: 2011-05-19

1.read马上返回20字节

作者: justkk   发布时间: 2011-05-19