gpt4 book ai didi

c++ - Linux 中的套接字——我怎么知道客户端已经完成?

转载 作者:太空宇宙 更新时间:2023-11-04 09:08:06 26 4
gpt4 key购买 nike

我目前正在尝试用 C++ 实现我自己的网络服务器 - 不是为了生产用途,而是为了学习。

我基本上是打开一个套接字,监听,等待连接,然后打开一个新的套接字,从中读取客户端发送的数据。到目前为止,一切都很好。但是我怎么知道客户端已经完成发送数据,而不是因为其他原因暂时停止发送更多数据?

我当前的示例:当客户端发送 POST 请求时,它首先发送 header ,然后连续两次“\r\n”,然后是请求正文。有时正文不包含任何数据。因此,如果客户端在发送 header 后暂时无法发送任何内容 - 我怎么知道它尚未完成其请求?

这是否完全取决于所使用的协议(protocol) (HTTP),我的任务是根据我收到的数据找出这一点,或者是否有类似 EOF 的套接字?

如果我无法从套接字中获取必要的信息,我该如何保护我的程序免受错误客户端的影响? (我想无论如何我都必须这样做,因为它可能是攻击者而不是发送错误数据的故障客户端。)我唯一的选择是继续阅读直到请求根据协议(protocol)定义或超时(由定义)完成我)到达了吗?

我希望这是有道理的。

顺便说一句:请不要告诉我使用某些库 - 我想学习基础知识。

最佳答案

协议(protocol) (HTTP) 会告诉您客户端何时停止发送数据。您无法从套接字中获取信息,因为客户端会将其保持打开状态以等待响应。

正如您所说,您必须防止错误的客户端未发送正确的请求。通常在请求不完整的情况下,超时将应用于读取。如果您在 30 秒内没有收到任何东西,例如,关闭套接字并忽略它。

对于 HTTP post,应该有一个 header (Content-Length)说明 header 结束后预计有多少字节。如果它是一个 POST 并且没有 Content-Length,则拒绝它。

关于c++ - Linux 中的套接字——我怎么知道客户端已经完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com