我不知道如何描述我的问题,所以我举了一个例子。
比尔通过TCP记分卡将数据发送给Alice。守则如下:
write(socketfd,buff,10000);爱丽丝已经知道数据大小总是10000。守则如下:
read(socketfd,buff,10000);问题是,爱丽丝是否有可能得到小于10000的数据,她需要再次读取套接字。
发布于 2017-03-06 09:42:07
是!TCP套接字提供了流接口,并且很有可能在多个部分中传递数据。
接收器应继续读取,直到收到所有数据。
while (totalRead < expectedSize) {
result = read(socketfd,buff + totalRead, expectedSize-totalRead);
if (result < 0) {
// nothing read, check for errors
} else {
totalRead += result;
if (result == 0) {
// Other end shutdown before sending the expected amount of data
}
}
}写作也是如此:
while (written < totalSize) {
result = write(socketfd,buff + written, totalSize - written);
if (result < 0) {
// nothing written, check for errors
} else {
written += result;
}
}发布于 2017-03-06 09:37:25
是的,TCP不是面向数据包的,网络堆栈可能决定以任何“块大小”来传递传入的数据。
这可能是你得到的前10%,然后有几秒钟的网络延迟,然后TCP可能交付到目前为止得到的数据,例如。
对于没有显式面向数据包的任何类型的I/O,您应该始终循环读取,直到得到预期的总量为止。这也适用于从普通本地文件中读取。
发布于 2017-03-06 09:37:37
如果有错误怎么办?如果您需要检查关闭的连接怎么办?这两种情况都由read使用返回的值报告。
请记住,首先,TCP是一个没有固定数据包大小的流协议,因此,如果尚未接收到所有数据,那么单个调用可能不会读取所有数据。其次,请记住,底层协议可能没有用于其传输的大数据包,并且会将数据分割成较小的块,您将一次只接收一个。
因此,请始终检查read调用读取的实际大小。
https://stackoverflow.com/questions/42621990
复制相似问题