2010-02-12 91 views
1

我们的应用程序是与Windows Java客户端进行通信的C服务器(此问题针对所述服务器的Windows端口)。在这个特定的实例中,我们正在向客户端发送数据,特别是,消息由一个7字节的头部组成,其中前3个字节都有特定的含义(op类型,标志等),最后4个字节包含其余的消息。出于某种原因,我绝对无法弄清楚,标题中的第三个字节以某种方式变化;如果我在send()上设置了一个中断点,我可以看到第三个字节是我期望的(0xfe),但是当我检入客户端时,该字节设置为0.其他每个字节都可以。 A用WireShark做了一些流量捕获,发现该字节为0,离开服务器,我发现它更令人困惑。第三个字节是通过定义,阿拉设置:为什么我在send()函数中丢失了这个字节?

#define GET_TOP_FRAME 0xfe 

一些测试我这样做,进一步混淆了问题:

  1. 我使用的定义来改变价值第一0x640xff0xfd:都发现了客户。
  2. 我将使用定义的值更改为使用0xfe本身:客户端的值为零。
  3. 我将定义本身的值从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是以前放在一起插座,protocolByteopbytes预先设置。然后它在这个消息之后立即发送一个非常类似的发送命令。正如我所提到的,如果我在该发送函数上放置了一个断点,tbuffer就包含了我期望的内容。

有人有什么想法吗?我完全难倒了;这对我来说没有任何意义。谢谢。

+0

完整的7字节数据包在线? (根据wireshark?) – pm100 2010-02-12 17:23:39

+0

是的。根据Wireshark的说法,我希望在那里存在除了那个神奇地转化的单个字节以外的其他东西。 – Morinar 2010-02-12 17:28:11

+0

您是否尝试禁用编译器优化? – mark4o 2010-02-12 17:29:37

回答

0

结果发现了其他一些方法:除了C服务器之外,我们还有一个Tomcat/Java服务器,它可以运行在所有服务器上;我会诚实的说,我没有参与这样的发展,所以我不太了解它。事实证明,我们有一些在middletier部分和我们客户之间共享的代码;这个共享代码在离开服务器时采用了特定的字节,如果设置为0xfe,则将其设置为未初始化的值(因此为零)。然后,当它到达客户端时,这是错误的。这就是为什么当我在C代码中将值设置为不同的东西时,它会将其转到另一端,以及为什么行为看起来不一致;我在Java中切换了相当多的值来看看发生了什么。

感谢所有的指针,但事实证明,这仅仅是我没有正确理解路径的情况。

1

这可能是因为系统中某处发生了简单的缓冲区溢出或类似的错误,但在给出这些小信息的情况下很难说出位置。但是,请记住:

TCP不发送消息 - 这是一个流。一个send()调用可能需要几个recv()调用来接收。一个recv调用可能会收到应用程序定义的部分“消息”。

您是否正在检查send的返回值? recv的返回值是什么?发送可能发送的字节数少于告诉它的数量。 recv可能收到的字节数比您告诉的要少,或者如果您给它一个足够大的缓冲区,它可能会接收比您的应用程序“消息”更多的数据。

+0

好点。我们实际上在循环中调用send()来检查发送的字节,所以我们可以保证我们正在发送所有内容。客户端的接收代码被抽象了一点,所以它不会很明显,一旦我确定由于Wireshark数据导致问题出现在服务器上,我就不再重视它了。 – Morinar 2010-02-12 17:21:42

相关问题