2016-04-29 154 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

您已經想出瞭如何處理有效負載的字符串部分。