2016-04-29 30 views
0

サーバーのC#バージョンを作成しようとしています。C++からC#へのコードの移行

元クライアントとサーバの両方がC++で書かれました。

私のC++クライアントから、私は新しいC#のサーバに接続することができます。しかし、私のC++クライアントはポインタを使ってデータを送るので、正しく読むためにいくつかの問題があります。

C++クライアントは、私のサーバーにシャアのPtr(CHAR * pDataを)を送信します。このデータには、ヘッダー(送信しているデータの種類(リクエストログイン))と本文(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()を使用して)文字列に変換しようとしましたが、成功しませんでした。

ありがとうございます!この時点でどんな助けも歓迎されます! よろしく

+0

C++の文字配列は '\ 0'で終わります。 c#では、データをC++に送信するときに終了文字を追加する必要があります。また、C++からデータを取得するときに文字配列の長さを判断するために終了文字をテストする必要があります – jdweng

答えて

1

あなたの問題は、データがポインタを使用して送信されていませんが、あなたは、バイナリデータを送っているということ。 C#サーバーは4バイトを数値に変換する必要があります。

あなたはこのためBitConverter.ToInt32を使用することができます。

あなたは既にペイロードの文字列の一部を処理する方法を考え出しました。

関連する問題