【问题标题】:Send exact number of bytes over a socket通过套接字发送确切的字节数
【发布时间】:2023-03-05 22:56:02
【问题描述】:

我读过在 Erlang 中使用 gen_tcp 可以将通过套接字发送的数据聚合到单个流中。如何强制套接字发送特定数量的字节?

【问题讨论】:

  • 不清楚您要解决什么问题。发送的字节数将始终是您指定的数字。它永远不会不发送您要求它发送的字节或发送您没有要求它发送的字节。
  • 我错了还是实际上或不同的发送操作可以聚合在一个块中? {no_delay, false} 应该是标准行为
  • 你所说的“单个块”是什么意思?如果您指的是在单个 TCP 读取操作中获得的数据量,那是任意的。这是 TCP 的基本属性,您对此无能为力。

标签: erlang gen-tcp


【解决方案1】:

TCP 是一种流协议(与面向数据包的 UDP 不同),例如意味着接收应用程序无法判断可用数据是来自客户端上的一个还是多个send() 调用。

您实际上无法控制 TCP 数据包中发送的字节数,多次send() 调用可能会导致接收到一个 TCP 数据包,而一次send() 调用可能会导致多个 TCP 数据包被接收发送。这由操作系统 TCP 堆栈控制。

在 Erlang 中,您可以使用套接字选项 {packet, 1|2|4}gen_tcp:connectgen_tcp:listen 来创建面向数据包的 TCP 数据处理。这会为每个send() 插入一个 1,2 或 4 字节前缀,并且接收方(假设它也是 erlang 并使用相同的{packet, N} 选项)将读取数据,直到接收到发送的字节数,无论如何消息被分割成 TCP 数据包。

gen_tcp:recv 的调用将阻塞,直到读取了预期的字节数。与活动模式套接字相同,消息以预期的字节数发送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多