在 http 中接收的字节大小可变。我可以假设单词“GET”或“POST”或“DELETE”将被传递到我的同一个 read() 函数调用
Posted
技术标签:
【中文标题】在 http 中接收的字节大小可变。我可以假设单词“GET”或“POST”或“DELETE”将被传递到我的同一个 read() 函数调用【英文标题】:Bytes received in http are of variable sizes. Can I assume words "GET" or POST" or ,"DELETE" will be delivered to my same read() function call 【发布时间】:2021-11-19 10:26:49 【问题描述】:http 请求中接收到的字节在 read() 函数调用中是可变大小的。
我至少可以假设:
3 characters word: "GET"
4 characters word: POST"
6 characters word: "DELETE"
将传递给我的同一个 read() 函数调用
或者我可以在第一次读取时获得GE
,在第二次读取时获得T
,以生成 HTTP 获取请求的“GET”字。
谁能告诉我这个?
我正在使用 linux 内核 5.11.0-36-generic
和命令 uname -r
可能是针对特定于http
协议的读取系统调用问题需要告知的内核版本信息,也可能不是
【问题讨论】:
“我至少可以假设:”基本上...不。不要假设任何事情。非常可能?是的。当然?不! 你需要收集传入的数据,直到你有足够的数据来判断数据是否是一个有效的请求。然后处理或丢弃该请求。 @Gerhardh 我认为我不能在单线程程序中做到这一点。因为我的单线程服务器会混淆来自不同用户连接的请求数据。你认为我做对了什么?为了处理每个请求,我需要分叉另一个线程并在请求特定线程中进行通信。思路对吗? 是的,我认为通常的做法是为每个连接创建一个线程。 【参考方案1】:我至少可以假设:将传递给我的同一个 read() 函数调用
没有。
我能否在第一次读取时获取 GE 并在第二次读取时获取 T 以生成 HTTP 获取请求的“GET”字。
是的。
嗯,这个答案似乎值得多写一点。 HTTP传输协议是在ISO/OSI model中的应用层起作用的协议。 HTTP 对其他层发生的事情没有任何要求,因此传输层可以是任何东西,并且消息可以按它想要的任何片段到达,只要消息在到达应用层时是满的。
因为没有要求,所以它与read()
调用无关,该调用使用传输数据的特定事物进行操作。虽然某些接口保证通过一个write()
调用和一个read()
调用来写入数据,例如fifo()
达到特定大小,但有些协议不能以任何方式保证这一点。
不过,这无关紧要。 HTTP 不关心数据是以什么块传输的,它们可以逐字节传输,或者一次发送两条消息,不关心。 当the application layer message is fully transmitted,那么数据被应用层解析为HTTP。
因为没有要求,所以您不能假设它们应该通过相同的read()
调用来交付。无论如何,您应该假设它可能发生读取 HTTP 消息将需要多个 read()
调用,还假设它可能发生 read()
可能会因 EAGAIN
而失败并且需要反正重复了。
【讨论】:
@user786you're litteraly 问“谁能告诉我这个?”,KamilCuk 准确地回答了你所问的问题。那么,您为什么评论说他的回答对您没有帮助?还是我错过了一点? @user786 查看小编辑以上是关于在 http 中接收的字节大小可变。我可以假设单词“GET”或“POST”或“DELETE”将被传递到我的同一个 read() 函数调用的主要内容,如果未能解决你的问题,请参考以下文章