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接受要一直等到没有数据为止
接受多少,返回值就多少
所以,TCP接受要一直等到没有数据为止
作者: Harry_lyc 发布时间: 2011-05-19
引用 1 楼 harry_lyc 的回复:
tcp的发送是没有数据边界的,一次发送100个字节,有可能一次接受100个字节,也有可能100次,一次接受1个字节。
接受多少,返回值就多少
所以,TCP接受要一直等到没有数据为止
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字节数据没有到啊?
引用 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字节数据没有到啊?
说……
引用 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个字节。
接受多少,返回值就多少……
所以用TCP的自己定义的消息需要加一个头,定义自己的消息体长度是多少,来判断还有多少数据没有收完。
引用 3 楼 magicxiaoz 的回复:
引用 2 楼 magicxiaoz 的回复:
引用 1 楼 harry_lyc 的回复:
tcp的发送是没有数据边界的,一次发送100个字节,有可能一次接受100个字节,也有可能100次,一次接受1个字节。
接受多少,返回值就多少……
作者: MagicxiaoZ 发布时间: 2011-05-19
while(read(...))
{
//数据放入缓冲区
}
直到while结束循环,可以认为一个接受完成了
{
//数据放入缓冲区
}
直到while结束循环,可以认为一个接受完成了
作者: Harry_lyc 发布时间: 2011-05-19
1.read马上返回20字节
作者: justkk 发布时间: 2011-05-19