sendto 虽然参数是 char const *, 这是历史原因,其实应该是 unsigned char const *.
和字符集没有任何关系。

解决方案 »

  1.   

    这个跟发送接收没有关系,应该是应用的部分接收完成的时候按照unicode方式解析
      

  2.   

    你发unicode的内容过去也行,指针转换一下就行了,只要两边协商好编码类型就可以了。
      

  3.   

    发送的时候强制转换为char *
    接收的时候强制转换为wchar_t *即可
      

  4.   

    注意 char 和 wchar_t 的转换即可,另外如果嫌麻烦可以设置成多字节编码。
      

  5.   

    网络数据传输理论上最好要用char,而不是wchar_t,因为使用wchar_t网络传输压力就大了一倍!所以char到wchar_t转换,wchar_t到char的转换是必不可少的
      

  6.   


    错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets 369 5 Chat Building an MFC project for a non-Unicode character set is deprecated.    在13中,MFC只能选择Unicode 字符集
      

  7.   

    sendto的参数要求是const char*
    就意味着只能发送char型数据了吗,当然不是这样的。
    它用const char*作参数,意思是按字节发送,具体发送多少个字节由int len参数提供,它不关心发送的具体是什么类型的数据。
    所以只要你发送方和接收方约定好了要发送什么数据,然后两边都强制转换即可,注意len参数,只要发送和接收的数据长度正确,就不会丢失数据什么。
      

  8.   

    我对两种字符集还是不理解,
    #include <stdio.h>
    #include <stdlib.h>
    #include <tchar.h>
    void main()
    {
    char ch[100]="中华人民共和国";
    wchar_t wch[100] = L"中华人民共和国";
    TCHAR str[100] = _T("中华人民共和国"); printf("%s\n", ch);
    wprintf(L"%s\n", wch);
    _tprintf(_T("%s\n"), str);
    system("pause");
    }
    为什么在多字符集下,第二个输出错误。而在unicode下,第二三个都输出错误?
      

  9.   

    比如:发送端
    wchar_t c[20] = L"abc";int sendto(s, (const char FAR *)c, wcslen(c)*sizeof(wchar_t), ...)
    接受端则:
    char* recivebuf; // 已接受数据buf和 int rlen
    wchar_t r[20] = {0}
    memcpy(r, recivebuf, rlen);这样即可,跟字符集没关系,关键是buf的发送长度
      

  10.   

    楼上已经说完了,const wchar_t*是可以直接强制转换成const char*的,所以,你直接强制转换即可,在发送字符串时,仅需要注意字符串这部分长度为wcslen(字符串) + 2 即可。
      

  11.   

    你的思路很好,但是我在接收时遇到了问题:
    TCHAR recvBuf[200];
    TCHAR recvTmp[300]; while (1)
    {
    recvfrom(socket, (char*)recvBuf, 200 * sizeof(TCHAR), 0,
    (sockaddr*)&addrFrom, &len);
    //::AfxMessageBox(recvBuf);
    CString strIP(inet_ntoa(addrFrom.sin_addr));
    //::AfxMessageBox(strIP);
    _stprintf_s(recvTmp,/*300*sizeof(TCHAR)错误*/
    _tcslen(recvBuf)*sizeof(TCHAR)+20
    /*300*sizeof(TCHAR)-2*/,
    _T("%s 说:%s"),strIP.GetBuffer() , recvBuf);
    ::PostMessage(hWnd, UM_RECVDATA, 0, (LPARAM)recvTmp);
    }
    这是一个线程中的循环用于接收数据,_stprintf_s(recvTmp,/*300*sizeof(TCHAR)错误*/
    _tcslen(recvBuf)*sizeof(TCHAR)+20,
    _T("%s 说:%s"),strIP.GetBuffer() , recvBuf);
    在这里指定recvTmp的数据大小时为什么注释部分有误呢
      

  12.   

    对的,只要发送方和接收方都知道是Unicode buffer就成,发送的时候不用管字符编码,直接作为buf发过去即可
      

  13.   

    给你一个我程序中的转换函数,直接声明一下即可使用:// Unicod To ANSI转换
    int CStringProc::UnicodToAnsi(CString str,char* buff)
    {
    int len=0;
    // UNICODE编码 转换成 ANSI编码
    len = ::WideCharToMultiByte(CP_ACP, NULL, str, 
    str.GetLength(), NULL, 0, NULL, NULL); // 取字串长度
    ::WideCharToMultiByte(CP_ACP, NULL, str, str.GetLength(), 
    buff, len, NULL, NULL);
    buff[len++]=0x00; // 写字串尾部结束标志 return len; // 转换长度
    }
      

  14.   

    转换成ansi编码干嘛?里面连中文都木有
      

  15.   

    我想知道为什么300*sizeof(TCHAR)错误
      

  16.   

    搞TCP/UDP通讯不会用抓包软件比如wireshark抓包等于不会搞。