从套接字读取是不是等待或获得 EOF?

Posted

技术标签:

【中文标题】从套接字读取是不是等待或获得 EOF?【英文标题】:Does reading from a socket wait or get EOF?从套接字读取是否等待或获得 EOF? 【发布时间】:2017-06-30 11:57:41 【问题描述】:

我正在用 C 实现客户端和服务器之间的简单连接。 在客户端,我处于一个循环中,从文件中读取;每次BUFFER_SIZE字节发送到服务器端(没有上传错误处理)。

//client side
bytesNumInput = read(inputFileFD,bufInput,BUFFER_SIZE)
bytesSend = write(sockfd,bufInput,bytesNumInput)

当然服务器也是循环的。

//server side
bytesRecv = read(sockfd,bufOutput,bytesNumInput)

现在,我的问题是:

    如果服务器读取速度快于客户端,我能否在连接过程中获取 EOF? 读取函数是等待获取所有数据还是与从文件中读取相同? 服务器是否可以在 1 次写入迭代中处理 2 次读取迭代?

【问题讨论】:

Docs are here. 都在里面。 “我可以在中间得到 EOF ...”,通过“EOF”,您是在问“文件结尾是否可以发生在中间...” 或 ""read()可以在中间返回EOF吗..."? @chux 这个问题的两种形式都是没有意义的。 “中间的EOF”已经是一个矛盾的术语。你的评论毫无意义。 @ejp A read(inputFileFD,bufInput,BUFFER_SIZE) 期待 BUFFER_SIZE 字节,文件结束条件可能发生在其中。 read() 可以在部分接收到部分BUFFER_SIZE 字节后针对各种条件返回-1。 @chux 对于read() 返回的内容,请参阅我的回答。问题是关于套接字,而不是文件,它是关于连接的中间,而不是读取的中间。当read() 返回时,-1 不是 EOF。您的问题没有区别。 【参考方案1】:

如果服务器读取速度比客户端快,我可以在连接中间获取 EOF 吗?

没有。 EOF 表示对等方已断开连接。如果连接仍然存在,read() 将阻塞,直到 (a) 至少一个字节被传输,(b) 发生 EOF,或 (c) 发生错误。

read函数是等待获取所有数据还是和从文件中读取一样?

见上文 (a)。

服务器是否有可能在 1 次写入迭代中处理 2 次读取?

是的。 TCP 是字节流协议,而不是消息传递协议。

【讨论】:

【参考方案2】:
    不,服务器将等待传入数据。套接字提供控制流。 我不清楚问题,阅读时总是尝试获取所有请求的数据,但如果没有那么多,那么它将获取可用的数据 是的,socket 没有消息的语义,只有字节流。

【讨论】:

(2) 是自相矛盾的。

以上是关于从套接字读取是不是等待或获得 EOF?的主要内容,如果未能解决你的问题,请参考以下文章

Unix下可用的五种 I/O 模型

在 Python 中使用管道文件描述符时如何检查 EOF?

发送图像时出现 Python 套接字错误。无法解码字节/意外 EOF

上传文件停止并在套接字异常上读取意外的 EOF

我如何获得在 unix 域套接字中排队的数据报数量

如何等待任何套接字有数据?