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'd在 unicode 上,常规名称被预处理器替换,名称以 W(对于 unicode)或 A(对于非 Unicode)结尾。正如 Mats Peterson 指出的那样。因此,当您将数据从对 recv 的调用中填充到 char* 数组中时,您必须将其转换为 wchar_t 以将其显示在文本框或任何其他 Windows UI 控件中。在 unicode 项目中使用窄字符 api 是“可以的”(因为 windows 只会在幕后为您将其转换为 Unicode),但如果连续快速完成可能会导致一些潜在的性能问题。

于 2013-01-01T21:41:49.490 回答