【发布时间】:2023-10-23 14:01:01
【问题描述】:
我们的应用程序是一个与 Windows Java 客户端通信的 C 服务器(这个问题是针对所述服务器的 Windows 端口的)。在这个特定的例子中,我们正在向客户端发送数据,特别是,消息由一个 7 字节的标头组成,其中前 3 个字节都有特定的含义(操作类型、标志等),最后 4 个字节包含消息的其余部分。出于某种原因,我完全无法弄清楚,标题中的第三个字节以某种方式发生了变化;如果我在send() 上设置一个断点,我可以看到第三个字节是我所期望的(0xfe),但是当我签入客户端时,该字节设置为 0。每隔一个字节就可以了. A 使用 WireShark 进行了一些流量捕获,发现离开服务器的字节为 0,我觉得这更令人费解。第三个字节是通过定义设置的,ala:
#define GET_TOP_FRAME 0xfe
我做的一些测试进一步混淆了这个问题:
- 我将值从使用定义更改为第一个
0x64、0xff、0xfd:全部都交给了客户。 - 我将值从使用定义更改为使用
0xfe本身:客户端的值为零。 - 我将定义本身的值从
0xfe更改为0xef:客户端的值为零。
这没有什么意义。代码经历了几个层次的功能,但这里是大部分核心代码:
int nbytes; /* network order bytes */
static int sendsize = 7;
unsigned char tbuffer[7];
tbuffer[0]= protocolByte;
tbuffer[1]= op;
tbuffer[2]= GET_TOP_FRAME;
nbytes = htonl(bytes);
memcpy((tbuffer+3), &nbytes, JAVA_INT);
send(fd, tbuffer, sendsize, 0);
其中fd 是先前组合的套接字,protocolByte、op 和bytes 是先前设置的。然后,它会在此消息之后立即使用非常相似的发送命令发送消息的其余部分。正如我所提到的,如果我在该发送函数上设置一个断点,则 tbuffer 包含的正是我所期望的。
这里有人有什么想法吗?我完全被难住了;这对我来说毫无意义。谢谢。
【问题讨论】:
-
完整的 7 字节数据包在网络上传输? (根据wireshark?)
-
是的。根据 Wireshark 的说法,除了那个神秘变化的单字节之外,我期望的一切都在那里。
-
您是否尝试禁用编译器优化?
-
看起来在我的调试版本中它从未启用过。