gpt4 book ai didi

c - 在 `sock_fd` 函数中使用哪个 `setsockopt`

转载 作者:行者123 更新时间:2023-12-05 04:19:54 26 4
gpt4 key购买 nike

我的客户端应用程序使用套接字作为 http 连接,意味着一次性发送、接收和关闭,我考虑使用单个持久连接,而不是每次单独连接,但问题是,有时服务器收到 2 个数据包32 kiB,而单个数据包为 64kiB,其他时候甚至更小,因此为了补偿 3 次握手引入的延迟,我想启用 TCP_FASTOPENTCP_NODELAY ,

我将 setsockopt 与客户端(connecting)套接字的两个选项一起使用,但我感到困惑:

  • 服务器端,要setsockopt的套接字,使用socket函数创建的套接字,或接受为两个选项编辑一个或两个,
  • 此外,是否有任何解决方案可以解决数据包的无意分区问题,例如 2x32k 或 4x16k,而不是 1x64k

谢谢你

我阅读了 linux 手册页中的文档,但发现它令人困惑

最佳答案

您的处理方式有误。

TCP 是一种流式传输协议(protocol),因此无法保证一侧对 send 的单个调用会对应另一侧对 recv 的单个调用。例如,您可以调用 send 一次,然后必须调用 recv 两次才能获取所有内容,或者您​​可以调用 send 两次并在一个文件中读取所有内容单个recv

您的协议(protocol)需要某种方式来确切知道要读取多少数据。如果您实际上使用的是 HTTP,这是内置在协议(protocol)中的,即读取由回车/换行符分隔的标题行,即 \r\n 后跟一个空行,然后是一个大小给定的正文通过 Content-Length header 。

如果您不使用 HTTP,您可以做一些简单的事情,例如首先发送 4 个字节的数据长度,然后发送那么多字节的数据。

在这两种情况下,您都recv 尽可能多的字节,如果协议(protocol)指示有更多数据,则您再次recv。您还需要注意以下情况:您已经阅读了完整的消息,但您读入的缓冲区中有更多数据,这表明您需要开始处理另一条消息。

无论您是否每次都建立新连接,您都需要执行所有这些操作,因此您最好让连接保持打开状态,而不必担心套接字选项。

关于c - 在 `sock_fd` 函数中使用哪个 `setsockopt`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74641624/

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