首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP套接字读取

TCP套接字读取
EN

Stack Overflow用户
提问于 2017-03-06 09:33:02
回答 6查看 213关注 0票数 2

我不知道如何描述我的问题,所以我举了一个例子。

比尔通过TCP记分卡将数据发送给Alice。守则如下:

代码语言:javascript
复制
write(socketfd,buff,10000);

爱丽丝已经知道数据大小总是10000。守则如下:

代码语言:javascript
复制
read(socketfd,buff,10000);

问题是,爱丽丝是否有可能得到小于10000的数据,她需要再次读取套接字。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-03-06 09:42:07

是!TCP套接字提供了流接口,并且很有可能在多个部分中传递数据。

接收器应继续读取,直到收到所有数据。

代码语言:javascript
复制
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
        }
    }
}

写作也是如此:

代码语言:javascript
复制
while (written < totalSize) {
    result = write(socketfd,buff + written, totalSize - written);
    if (result < 0) {
        // nothing written, check for errors
    } else {
        written += result;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-03-06 09:37:25

是的,TCP不是面向数据包的,网络堆栈可能决定以任何“块大小”来传递传入的数据。

这可能是你得到的前10%,然后有几秒钟的网络延迟,然后TCP可能交付到目前为止得到的数据,例如。

对于没有显式面向数据包的任何类型的I/O,您应该始终循环读取,直到得到预期的总量为止。这也适用于从普通本地文件中读取。

票数 2
EN

Stack Overflow用户

发布于 2017-03-06 09:37:37

如果有错误怎么办?如果您需要检查关闭的连接怎么办?这两种情况都由read使用返回的值报告。

请记住,首先,TCP是一个没有固定数据包大小的流协议,因此,如果尚未接收到所有数据,那么单个调用可能不会读取所有数据。其次,请记住,底层协议可能没有用于其传输的大数据包,并且会将数据分割成较小的块,您将一次只接收一个。

因此,请始终检查read调用读取的实际大小。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42621990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档