好的 – 所以我似乎从来没有一个简单的问题.
我有一个用C编写的自定义库(不是我写的).这个库做了一些网络通信,我只是将一些数据作为字节数组传递给它,并从另一侧检索一个字节数组.该库为我处理所有网络内容,即向/从客户端/服务器发送/接收数据.
例如,我可以编写客户端和服务器.从客户端我生成一个字节数组,该库获取字节数组并将其发送到服务器.我编写的服务器使用相同的库来执行相反的操作,即处理所有流量接收并最终传回一个字节数组.
该库将字节数组定义为结构的一部分,如下所示…(我在Delphi中静态加载库,不要认为这会有所作为,但我使用的是FastMM4 – 这会影响到应用程序和DLL之间的内存共享模型?我知道使用FastMM应该没关系,也试过ShareMem无济于事)
struct content { void *data; int size; }
无论如何,从我的客户端我试图发送“你好”…接受的智慧是字节数组数据通过使用memcpy复制到这个结构中,如此…
char *data = "Hello"; memcpy((void *)content.data(),data,strlen(data)); // last parameter is length,ie 5 // network.sendrequest(content); // where content.data() returns the aforementioned pointer
char *data = "World"; memcpy((void *)content.data(),ie 5 // network.sendreply(content);
从与C服务器通信的C客户端,我在服务器上收到这些数据……
0x0035fdf6 "Hello" (or in Bytes... 72,101,108,111)
所以在那篇文章之后,我认为C服务器代码是正确的,因为如果我用C编写客户端我可以正确地进行通信……但用Delphi编写的客户端替换C客户端是行不通的.我已经用CopyMemory替换了memcpy,我认为它做了同样的事情但不知何故我的字节数组在到达C服务器时有所不同…我的Delphi客户端执行以下操作…
// lDataPointer is a retrieved reference to the // pointer (void *data; see above) defined in the // C++ library. It appears to be a valid pointer at runtime... lContentPointer := content.data(); // from DLL // Where ByteArray is populated with byte data of "Hello" CopyMemory(lContentPointer,@ByteArray,5); // Copy from Exe to DLL // network.sendrequest(lContentPointer); // I have printed the byte array before the CopyMemory to check // its contents before sending,which is '72 101 108 108 111'
所以来自Delphi客户端的数据看起来是正确的,但服务器上收到的数据是不正确的…不知怎的“你好”(’72 101 108 108 111′)变成了
0x003efd96 "h,H" (or in Bytes 104,19,44,2,72)
我怀疑我在使用CopyMemory做错了什么……?或者我有exe和DLL之间的内存共享错误?我如何知道C网络库使用哪种内存模型?或者我刚刚错误地复制了该字节数组?任何帮助非常感谢…