在 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() 函数调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中确定“单词”的大小

Uart 接收到正确的字节,但顺序混乱

如何从字节数组元素中解包/提取低阶和高阶值

C ++中(整个)单词的拆分

将可变大小的字节数组转换为整数/长整数

我可以假设 long int 的大小总是 4 个字节吗?