【发布时间】: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 发送数据满足这些条件,而您的本地测试则不满足这些条件。 (时间和分包边界是一件事,可能会有所不同,这就是为什么我询问您的发送和接收处理)