我们的应用程序是与Windows Java客户端进行通信的C服务器(此问题针对所述服务器的Windows端口)。在这个特定的实例中,我们正在向客户端发送数据,特别是,消息由一个7字节的头部组成,其中前3个字节都有特定的含义(op类型,标志等),最后4个字节包含其余的消息。出于某种原因,我绝对无法弄清楚,标题中的第三个字节以某种方式变化;如果我在send()
上设置了一个中断点,我可以看到第三个字节是我期望的(0xfe
),但是当我检入客户端时,该字节设置为0.其他每个字节都可以。 A用WireShark做了一些流量捕获,发现该字节为0,离开服务器,我发现它更令人困惑。第三个字节是通过定义,阿拉设置:为什么我在send()函数中丢失了这个字节?
#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?) – pm100 2010-02-12 17:23:39
是的。根据Wireshark的说法,我希望在那里存在除了那个神奇地转化的单个字节以外的其他东西。 – Morinar 2010-02-12 17:28:11
您是否尝试禁用编译器优化? – mark4o 2010-02-12 17:29:37