【问题标题】:Weird data mangling when connection is over the internet通过 Internet 连接时出现奇怪的数据损坏
【发布时间】:2014-01-17 18:46:05
【问题描述】:

我正在使用https://github.com/gaby64/sf

当我通过 127.0.0.1 连接本地时,一切都很好
这是一个 32 字节的数据片段,我应该在本地获取和获取:

00000000 00000000 00000000 00000100 00000000 00001010 01000111 01000101 01010100 01000001 01010000 01010000 01010000 01001011 01000111 00000000 11111111 11101000 01111011 00100000 00100010 01101001 01101101 01100111 00100010 00111010 00100000 01011011 00100000 01011101 00101100 00100000

这是我通过我自己的外部互联网 ip 连接时获得的数据:

00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 01011100 00101111 01011100 00101111 00100000 01100100 01110010 01101001 01101100 01101100 00100000 01100100 01101111 01110111 01101110 00100000 01110100 01101111 00100000 01110100 01101000 01100101 00100000 01101001

对于 84kb 多部分消息,它似乎完全混合,并且大部分为 NULL。
小消息似乎没有受到影响。

有什么我没有考虑到的吗?
几个月前它还在工作,从那以后我不得不重新安装 linux,所以我无法在与它运行时完全相同的条件下进行测试。

还有一点奇怪的是,当我尝试通过外部 ip 访问使用 libwebsockets 提供的网页时,它只能部分加载高达 20kb 的网页,通过 localhost 也可以正常工作。

我应该提到它都是可重复的,总是以相同的方式进行转换。

运行wire-shark 来分析流量,我不是tcp/ip 协议方面的专家,但在查看数据包时看起来一切正常。内核必须负责,我的应用程序是否存在影响该内核的泄漏?尽管没有来自 valgrind 的警告。

【问题讨论】:

  • 您要记住,在 TCP 下,send() 和 recv() 可以发送介于零和您传递给它们的所有字节之间的任何位置,并且如果它们发送/接收仅部分缓冲区,你处理得对吗?
  • 是的,我是。无论如何,这将如何影响它在本地工作与通过 ISP 交换机/路由器? [\n] 我还记录了每次发送,似乎没问题 [\n] 第 5 个字节后数据错误
  • 你考虑字节序吗? ntohl(网络到主机)和 htonl(主机到网络)
  • 除非 ISP 正在解包数据包并解释我的数据并重新打包,否则这无关紧要。主机和来宾是同一台机器。我用来序列化 32 位和 16 位数字的函数确实转换为网络字节顺序并返回我相信。
  • 好吧,我想 ISP 可能正在修改数据;您可以尝试使用其他 ISP 来查看它是否也在那里损坏。也就是说,如果我们假设 ISP 工作正常,那么您的代码中仍有可能存在仅在某些条件下显示其症状的错误,并且通过您的 ISP 发送数据满足这些条件,而您的本地测试则不满足这些条件。 (时间和分包边界是一件事,可能会有所不同,这就是为什么我询问您的发送和接收处理)

标签: c sockets tcp


【解决方案1】:

我终于明白了, 我不知道 TCP 不能穿越 NAT 路由器。

直接连接到我的调制解调器可以解决问题。

【讨论】:

    【解决方案2】:

    您必须使用某种方法来检查您是否收到了与您发送的相同的内容。有很多方法可以做到这一点。一种众所周知且在 Internet 上很容易找到的方法是校验和方法。搜索它。

    【讨论】:

    • TCP/IP 应该已经处理了丢包和排序问题。数据不应该每次都以相同的方式出现乱码,为什么会发生通过我的 ISP 发送流量而仅使用 localhost 时不会发生?
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2014-06-10
    • 2012-12-04
    • 2012-01-01
    相关资源
    最近更新 更多