1

私はC ++、Windowsプログラミング、およびこれらのフォーラム(手順に違反して申し訳ありません)に不慣れで、しばらくしてこれに対する答えを追跡できなかったので、ここに行きます...

現在、クライアントが接続するのを待っているサーバーで構成されている小さなチャット プログラムを作成しています。クライアントが接続すると、「接続しました!」というメッセージが送信されます。クライアントは、サーバーに自動的に接続し、接続メッセージを受信して​​、複数行のテキスト ボックスに入力する Win32 アプリケーションです。

私はそれを機能させましたが、サーバーの応答を wchar_t に変換するためにいくつかのコードを使用する必要がありました。クライアントまたはサーバーをセットアップするためのより良い方法はありますか、それとも正しい方法ですか?

関連するサーバーコードは次のとおりです...

    ...
    //JMP_:sListen and sConnect are both = socket(AF_INET, SOCK_STREAM,NULL);

    if(sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen)){
        cout << "A connection was found" << endl;
        send(sConnect,"You have connected!", 20, NULL);
    }
    ...

これは、サーバー応答の char 配列を宣言するコードの一部です...

    ...
    // includes up here

    char serverresponse[255];

    // WinMain down here
    ...

サーバーからメッセージを受信するコードのビット...

    ...
    //JMP_: this is in the WinMain function.

    connect(sConnect, (SOCKADDR*)&addr, sizeof(addr));
recv(sConnect, serverresponse, sizeof(serverresponse), NULL);
getchar();
    ...

この最後のコードは、サーバーの応答をテキスト ボックスに入力する場所です...

    ...
    // JMP_: this is in WndProc

    case WM_CREATE:
        {
         // Create an edit box
        hwndEdit = CreateWindowEx(0, _T("EDIT"),
            NULL,
            WS_CHILD|WS_VISIBLE|WS_VSCROLL |
            ES_LEFT | ES_MULTILINE|ES_AUTOVSCROLL,
            50, 100, 200, 100,
            hWnd,
            (HMENU) ID_EDITCHILD,
            (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL);

        //JMP_: I just pulled this indented bit from MSDN
            // Convert to a wchar_t*  
            size_t origsize = strlen(serverresponse) + 1;
            const size_t newsize = 100;
            size_t convertedChars = 0;
            wchar_t wcstring[newsize];
            mbstowcs_s(&convertedChars, wcstring, origsize, serverresponse, _TRUNCATE);
        //

        // Add text to the window. 
        SendMessage(hwndEdit, WM_SETTEXT, 0,  (LPARAM) wcstring);

        return 0;
        }
4

1 に答える 1

0

サーバーの応答を wchar_t に変換する必要があるのは、クライアント コードを Unicode ビルドとしてビルドし、その後、car* または wchar* のいずれかを期待するウィンドウに対して行われるすべての API 呼び出しが #ifdef されるためです。 Unicode では、従来の名前はプリプロセッサによって W (Unicode の場合) または非 Unicode の A で終わる名前に置き換えられます。マッツ・ピーターソンが指摘したように。したがって、データを recv の呼び出しから char* 配列に詰め込むと、それを wchar_t に変換して、テキスト ボックスまたはその他の Windows UI コントロールに表示する必要があります。Unicode プロジェクトでナロー文字 API を使用しても問題ありませんが (Windows は舞台裏でそれを Unicode に変換するだけなので)、立て続けに使用すると潜在的なパフォーマンスの問題が発生する可能性があります。

于 2013-01-01T21:41:49.490 に答える