2016-04-29 109 views
0

我正在尝试编写一个C#版本的服务器。将代码从C++迁移到C#

原始客户端和服务器都是用C++编写的。

从我的C++客户端,我可以连接到新的C#服务器。但是因为我的C++客户端使用指针发送数据,所以我有一些麻烦来正确读取它。

C++客户端将Char Ptr(char * pData)发送到我的服务器。这些数据包含一个Header(通知我发送什么类型的数据,即:请求登录)和一个Body(包含实际数据,即:ID和密码)。

检查旧的服务器,我可以看到它读取数据是这样的:

DWORD *dwpMsgID; 
dwpMsgID = (DWORD *)(pData + DEF_INDEX4_MSGID); // define DEF_INDEX4_MSGID 0 because its the header position 
switch (*dwpMsgID) 
{ 
    ... 
    case MSGID_REQUEST_LOGIN: doSomething(); // define MSGID_REQUEST_LOGIN 0x0DF3074F 
    ... 
} 

之后,它会检查该名/密码是这样的:

cp = (char *)(pData + DEF_INDEX2_MSGTYPE + 2); 

memcpy(cAccountName, cp, 10); 
cp += 10; 
memcpy(cAccountPass, cp, 10); 
cp += 10; 

我的疑问是:因为我正在从C#套接字获取一个字节[],我怎么能检查标题以查看它是否与“0x0DF3074F”匹配,然后获取AccountName和Password? 我试图将该字节[]转换为字符串(使用Encoding.Unicode.GetString()或Encoding.ASCII.GetString()),但我没有成功。

提前致谢!任何帮助将受到欢迎,在这一点上! Regards

+0

C++中的字符数组以'\ 0'结尾。在c#中,当向C++发送数据时必须添加结束字符,并且必须测试结束字符以确定从C++获取数据时字符数组的长度 – jdweng

回答

1

您的问题不是数据正在使用指针发送,而是您正在发送二进制数据。您的C#服务器需要将4个字节转换为数字。

您可以使用BitConverter.ToInt32

您已经想出了如何处理有效负载的字符串部分。