【问题标题】:recv() links messagesrecv() 链接消息
【发布时间】:2012-06-14 17:52:13
【问题描述】:

我有一段代码:

while(1) {
    if(recvfrom(*val, buffer, 1024, MSG_PEEK, NULL, NULL)==-1) {    
        perror("recv");
        exit(1);
    } else printf("recv msgpeek\n");
    if(*(int*)buffer>5) {
        if(recvfrom(*val, buffer, 1024, 0, NULL, NULL)==-1) {   
            perror("recv");
            exit(1);
        } else printf("recv\n");
        if(*(int*)buffer==6) {
                    printf("%d\n", *(int*)(buffer+sizeof(int)+30));
                    printf("%s\n", (char*)buffer+sizeof(int));
                }
   }

这是客户计划的一部分。我正在从服务器向该客户端发送消息,并且我注意到当客户端收到此消息时,它们已连接。我正在使用 SOCK_STREAM 类型的套接字。有谁知道如何避免连接消息?

【问题讨论】:

  • 不清楚你到底想避免什么。
  • 我试图避免连接消息,我想在发送它们时获取它们 - 作为两条单独的消息。
  • TCP,我在创建套接字时使用 SOCK_STREAM
  • 如果这是 TCP,你为什么使用recvfrom?尝试改用recv
  • @Adam 现在,我正在使用它,我只是想以这种方式解决问题。

标签: c sockets network-programming


【解决方案1】:

如果我理解正确,您正在从 TCP 套接字读取数据,并期望获得与从另一端“发送”的字节数完全相同的字节数。在这里,您的假设是错误的。 TCP 套接字是一个双向流,即它不保留您通过它发送的应用程序消息的边界。连接一侧的“写入”可能导致另一侧的多次“读取”,反之,可以一起接收多个“写入”。最后一种情况就是您所看到的。跟踪消息边界是您的责任。

相关问题 - Receiving data in TCP

【讨论】:

    【解决方案2】:

    如果我理解得很好,您的问题是您发送了 2 条示例消息,但您收到了一条,其中包含发送的两条消息的内容。这是由于 TCP 用于提高效率的 Nagle 算法。如果您想禁用此算法,请使用TCP_NODELAY 选项。

    【讨论】:

    • 不,这是由于 TCP 的基本性质造成的。
    • 是的,这个基本性质使用了 Nagles 算法。 tcp 的手册页说如果设置了 TCP_NODELAY 选项,则禁用此行为。
    • 不,Nagle 算法是一种优化。 TCP 的基本性质是它为您提供 而不是“消息”。
    • 好的,所以 Nagle 是一个依赖于系统的优化?例如Linux支持它,也许其他系统不支持? (这意味着如果没有此选项,您将无法在这些系统中发送不同的“消息”?)
    • Nagle 是对基础 TCP 的优化,以减少在宽互联网上流动的小型 IP 数据包的数量,从而提高 吞吐量。只有在需要低延迟时才禁用 Nagle,例如在远程交互程序(如 telnet)中。 TCP 现在不涉及应用程序消息。您必须在 TCP 流上设计自己的 应用程序协议 来处理这些(固定长度的消息、长度前缀、消息分隔符是您的一些选项)。
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2019-08-06
    • 2012-01-18
    • 2010-10-23
    • 2020-07-27
    相关资源
    最近更新 更多