gpt4 book ai didi

sockets - Erlang套接字发送超时永远不会发生

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:10 25 4
gpt4 key购买 nike

我正在用 Erlang 实现一个与手机客户端通信的 TCP 服务器。手机经常掉线,所以服务器必须能够检测到。因此,我希望服务器在超时的情况下向客户端发送消息,以便在发生超时时关闭连接并将客户端标记为离线。

我在服务器上使用了这个监听选项:

[{certfile, "cert.pem"},   
{keyfile, "key.pem"},
{reuseaddr, true},
{active, false},
{send_timeout, 10000}]

在服务器和手机之间建立连接后,我将手机切换到飞行模式(关闭所有无线信号),然后在服务器上执行ssl:send。 send 函数返回 ok 就好像数据包发送成功了。

我做错了什么?

最佳答案

您是否在 inet 的套接字上设置了 {send_timeout_close, true} 参数?如果不是,套接字不会关闭,只是返回一个超时错误。 ssl 也存在吞下您的错误并对其进行处理的风险。

其他几点:

  • 请记住检查任何 ssl:sendssl:receive 选项的返回值是否有错误。重要的是要知道发送是否顺利。

    ok = ssl:send(Sock, Data),
  • 即使设置了 send_timeout,底层 TCP/IP 堆栈实际上可能会接受数据,但由于另一个端点已关闭而无法发送数据。当堆栈意识到它从未收到 ACK 时,关闭端口的信息会在稍后到达。

  • inet 中定义了套接字的 raw 条目类型。它允许您设置特定于操作系统的套接字选项。可以强制操作系统更积极地检测连接丢失。

  • 另一种选择是在 ssl:recv/3 调用中提示所有内容,其中超时表示设备丢失,无论其套接字状态如何。它的优点是还可以检测另一端的应用程序故障,因为它不会沿着确定的路径前进。无论如何,您都必须这样做才能处理进一步的请求。

  • 手机客户端也可以行动。如果它通过 SSL 发送了一条消息并且接收从未到达(由于飞行模式)——那么它就知道出了什么问题。然而,服务器可能不知道这一点。

  • TCP/IP 提供可靠的、面向连接的流协议(protocol)。它不能防止突然断开连接。这很重要,因为您的协议(protocol)必须自己处理断开连接问题。如果您的协议(protocol)有某种确认或承认,这一点尤为重要。

关于sockets - Erlang套接字发送超时永远不会发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4322532/

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