none
Unicode下使用sendto函数问题,或者WCHAR* 转换为 char*的问题 RRS feed

  • 问题

  • sendto函数的第二个参数要求是const char* 型,而在Unicode下面使用的CString是WCHAR型的,请问是否有unicode版本的sendto 函数可以使用,或者将CString 转换为 const char*型的最好最常用的方法。

    我是用的W2A宏转换str.GetBuffer();,不知道这种方法好不好,有没有更好的方法或者函数。

    当然,最好是能够直接发送WCHAR* 型的数据,而不要转换。


    难得改
    2011年7月17日 16:46

答案

  • 这个没有关系,可以直接发送wchar_t*数据,甚至您可以直接发送结构体(当然您的结构体中最好不要有指针成员,这样的话您就不能直接发送过去,可以想象一下why?),只要您的发送端和接收端保持一致即可,类似下面的代码.
    // 发送端:
    wchar_t buf[] = {L"Hello,World"};
    sendto(sock, (char*)buf, sizeof(wchar_t)*(wcslen(buf)+1), 0, (LPSOCKADDR)&addr, len);
    
    // 接收端:
    wchar_t buf[100] = {0};
    recvfrom(sock, (char*)buf, 100, 0, NULL, NULL);
    wprintf(L"%s", buf);
    


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 难得改a 2011年7月18日 2:43
    2011年7月18日 0:26
    版主

全部回复

  • 这个没有关系,可以直接发送wchar_t*数据,甚至您可以直接发送结构体(当然您的结构体中最好不要有指针成员,这样的话您就不能直接发送过去,可以想象一下why?),只要您的发送端和接收端保持一致即可,类似下面的代码.
    // 发送端:
    wchar_t buf[] = {L"Hello,World"};
    sendto(sock, (char*)buf, sizeof(wchar_t)*(wcslen(buf)+1), 0, (LPSOCKADDR)&addr, len);
    
    // 接收端:
    wchar_t buf[100] = {0};
    recvfrom(sock, (char*)buf, 100, 0, NULL, NULL);
    wprintf(L"%s", buf);
    


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 难得改a 2011年7月18日 2:43
    2011年7月18日 0:26
    版主
  • 非常非常感谢您的回答,问题已经解决,在传送WCHAR时,主要是长度错误了。

    在接收到传送过来的数据后,对于char和WCHAR组合成一组WCHAR也遇到了一些问题,不过解决了。

    使用unicode经常遇到各种各样、千奇百怪的问题,晕死了。

    我想只要不是或者不含有像指针那样的指向类数据,应该都可以当作char型的数据发送,因为它又不需要显示,对它来说,只是发送一段二进制代码而已,那怕你是整型或者其它的复杂数据类型,它全都可以当作是char类型发送出去,只要接收端知道发送过来的是什么就行了。

    而之所以不能发送指针类型的数据,我想应该是因为指针类型的数据指向的是程序当前进程内存块中的某个地址,发送到其它地方就没有意义了。

    再次感谢您的回答,真是让我受益匪浅!


    难得改
    2011年7月18日 3:03