2013-01-01 20 views
1

我是新来的c + +,Windows编程和这些论坛(对任何违反程序抱歉),并在一段时间后,我一直无法追查这个答案,所以这里去...正在将我的服务器响应字符数组转换为wchar_t数组处理我的客户端收到的服务器消息的正确方法?

我是编写一个小聊天程序,该程序目前包含一个服务器,它等待客户端连接,当客户端连接时发送消息“您已连接!”。客户端是一个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); 
    } 
    ... 

这里是哪里,我宣布了服务器响应的字符数组的代码位...

... 
    // 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; 
     } 
+0

有什么特别你coincerned什么? –

+0

我只关心或困惑为什么我必须将其转换。我不明白为什么没有一个接收char数组的SendMessage。有 –

+0

有。 SendMessage是一个扩展到SendMessageA或SendMessageW的宏,因此假设你只有有效的ASCII文本(而不是UTF-8),可以使用SendMessgeA()。 –

回答

0

你要转换的服务器响应wchar_t的原因是因为你建立你的客户端代码为Unicode生成,随后被在窗口完成所有的API调用,期望car *或wchar *中的任何一个都是unicode上的#ifdef'd,常规名称由预处理器替换,名称以W结尾(对于unicode)或A代表非Unicode。就像Mats Peterson指出的那样。所以会发生什么情况是,当你将数据从recv调用到char *数组时,必须将其转换为wchar_t以在文本框或任何其他Windows UI控件中显示它。在unicode项目中使用窄字符api是可以的(因为windows会在后台将它转换为Unicode),但如果快速连续完成,可能会导致一些潜在的性能问题。

相关问题