我正在写一个网络服务器在c。我正在与TCP套接字,我想知道如何读取后请求,并把它放到一个缓冲区。我能做的是首先读取post header in a buffer with the fixed length然后创建一个基于content_length的动态缓冲区并读取动态缓冲区中的主体.但是因为post header的大小可以变化,在读取之后,包含该header的缓冲区也可以包含post request的主体.我可以尝试进一步解析它,但是这样做是否有效?有更好的方法吗?
eqqqjvef1#
那么,在你的情况下,我会说,“最好的方法”是把每一步分为自己的过程。首先,为了解析消息,您必须不断地从底层设备(文件、套接字、管道等)读取raw字节,并“馈送”解析器,直到消息完成。解析消息也可以被划分为不同的步骤:
由于每一步都涉及到处理未知大小的字节(由分隔符分隔并且不是特定大小的,除非我们已经“解析”了内容长度并且知道主体大小),因此每个过程都有其自己的缓冲区需求,例如:
\r\n
:
所以长话短说您必须将消息解析器划分为不同的处理步骤(如果您希望避免意大利面条式代码,强烈建议您这样做),并决定何时使用固定大小或可重新分配的缓冲区以及如何重用它们(如果没有严格按照每个步骤进行分隔的话)。一旦您完成了这些操作并有了一个像样的实现,那么我们就可以讨论如何减少内存分配的使用和缓冲区的重用。
1条答案
按热度按时间eqqqjvef1#
那么,在你的情况下,我会说,“最好的方法”是把每一步分为自己的过程。
首先,为了解析消息,您必须不断地从底层设备(文件、套接字、管道等)读取raw字节,并“馈送”解析器,直到消息完成。
解析消息也可以被划分为不同的步骤:
由于每一步都涉及到处理未知大小的字节(由分隔符分隔并且不是特定大小的,除非我们已经“解析”了内容长度并且知道主体大小),因此每个过程都有其自己的缓冲区需求,例如:
\r\n
:
\r\n
组成\r\n
〈body〉,其中正文部分是可选的(内容长度为零)所以长话短说您必须将消息解析器划分为不同的处理步骤(如果您希望避免意大利面条式代码,强烈建议您这样做),并决定何时使用固定大小或可重新分配的缓冲区以及如何重用它们(如果没有严格按照每个步骤进行分隔的话)。一旦您完成了这些操作并有了一个像样的实现,那么我们就可以讨论如何减少内存分配的使用和缓冲区的重用。