gpt4 book ai didi

tcp - 数据包有时会连接起来

转载 作者:可可西里 更新时间:2023-11-01 02:31:55 24 4
gpt4 key购买 nike

我正在尝试用 Erlang 制作一个简单的服务器/应用程序。
我的服务器使用 gen_tcp:listen(Port, [list, {active, false}, {keepalive, true}, {nodelay, true}]) 初始化套接字,客户端使用 gen_tcp 连接:connect(Server, Port, [list, {active, true}, {keepalive, true}, {nodelay, true}])。从服务器收到的消息由守卫测试,例如 {tcp, _, [115, 58 |数据]}.

问题是,数据包在发送或接收时有时会连接起来,因此导致意外行为,因为守卫将下一个数据包视为变量的一部分。

有没有办法确保每个数据包都作为一条消息发送到接收进程?

最佳答案

普通 TCP 是一种没有数据包边界概念的流式传输协议(protocol)(如 Alnitak 所说)。

通常,您使用 UDP(每个数据包的大小有限并且可以乱序接收)或使用帧协议(protocol)的 TCP 发送消息。

Framed 表示您在每条消息前加上一个大小 header (通常为 4 个字节),指示消息的长度。

在 erlang 中,您可以将 {packet,4} 添加到您的套接字选项中,以在 TCP 之上获取成帧数据包行为。

假设双方(客户端/服务器)都使用 {packet,4} 那么你只会得到完整的消息。

注意:您不会看到大小标题,erlang 会从您看到的消息中删除它。所以你在顶部的示例匹配仍然可以正常工作

关于tcp - 数据包有时会连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9049310/

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