【问题标题】:TCP data before session closing会话关闭前的 TCP 数据
【发布时间】:2012-10-25 07:05:51
【问题描述】:

在会话关闭之前,是否有任何方法允许通过 tcp 发送所有数据? 我得到的是我必须在收到数据后才从服务器关闭会话,而且我必须手动传递 EOL 或回车或“\n”或“\r”。

感谢任何帮助和建议。

【问题讨论】:

  • TCP 总是在你读取 EOS 之前传递所有发送的数据。你的问题到底是什么?
  • 但在我的情况下,它等待会话关闭,然后只发送所有数据。我尝试一次提取一个字符以及所有完整数据,但在这两种情况下,我都必须在末尾循环使用“\r”来读取下一个数据。
  • 那么显然你没有在适当的点刷新输出。
  • 请告诉我如何在检索所有数据之前刷新输出,因为我必须加密、反序列化,然后根据一些键将其渲染到我的表格视图中。
  • 我不清楚哪一方没有接收数据以及哪一方正在关闭连接。您的意思是在服务器关闭连接之前,您不会收到来自服务器的所有数据?

标签: cocoa networking tcp cocoaasyncsocket


【解决方案1】:

您可以尝试设置SO_LINGER 套接字选项:

GCDAsyncSocket asyncSocket = ...;
struct linger linger;
linger.l_onoff = 1;
linger.l_linger = 30;
int rv = setsockopt([asyncSocket socketFD], SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));
if (rv < 0)
{
    // handle error
}

【讨论】:

  • 这对接收者没有任何影响。它所做的只是在发送待处理数据时在 close() 中延迟发送方长达 30 秒。
  • @EJP 这个答案的所有 cmets 发生了什么?
  • @Anoop-Vaidya 这实际上解决了问题吗?如果是这样,您是否会解释一下,或许也让 EJP 参与进来。
【解决方案2】:

在会话关闭之前,是否有允许通过 tcp 发送的所有数据?

你一直从套接字读取数据,直到收到EOF

我得到的是只有在收到数据后我才必须从服务器关闭会话

从技术上讲,可以关闭 TCP 连接的写入端,使用 shutdown(socket, SHUT_WR) 表示此对等方不再发送任何数据。但它仍然需要读取所有数据,直到看到EOF,然后看到close(socket)

而且我必须手动传递 EOL 或回车或“\n”或“\r”

这与套接字或 TCP 无关,而是与更高的应用程序协议(例如 HTTP)有关。有可用于这种流行协议的库来简化此任务。

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2012-12-19
    • 2021-03-10
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多