从套接字读取是不是等待或获得 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?的主要内容,如果未能解决你的问题,请参考以下文章