小弟正在用套接字相关函数做一个聊天室系统。
目前遇到这样一个问题,十分纠结。
我用的是vs2008,使用unicode编码。
想将CString数据传递
CString strTempInfo;
send(m_client, (char*)strTempInfo.GetBuffer(0), strTempInfo.GetLength(), 0);
但总是接收不到
num = recv(m_clients[p], (char*)buffer.GetBuffer(0), buffer.GetLength(), 0);不知该怎么办?

解决方案 »

  1.   


    LPSTR CStringToChar(CString strValue)
    {
    #if defined(_UNICODE) || defined(UNICODE)
    LPTSTR ret = new TCHAR[strValue.GetLength()+1];
    lstrcpy(ret,strValue.GetBuffer());
    LPWSTR lpWStr = (LPWSTR)ret;
    int len = _tcslen(lpWStr)*2+1;
    LPSTR strbuf = new char[len];
    memset(strbuf,0,len);
    WideCharToMultiByte(CP_OEMCP,0,lpWStr,-1,strbuf,len,NULL,NULL);
    return strbuf;
    #else // For Ansi Version
    LPTSTR ret = new TCHAR[strValue.GetLength()*2+1];
    lstrcpy(ret,strValue.GetBuffer());
    return (LPSTR)ret;
    #endif
    }
    CString strTempInfo;
    LPSTR temp = CStringToChar(strTempInfo);send(m_client, temp , strlen(temp), 0);将CString转化为char*再发送
      

  2.   

    C/C++ codeLPSTR CStringToChar(CString strValue)
    {
    #if defined(_UNICODE) || defined(UNICODE)
        LPTSTR ret = new TCHAR[strValue.GetLength()+1];
        lstrcpy(ret,strValue.GetBuffer());
        LPWSTR lpWStr = (LPWSTR)ret;
        int len = _tcslen(lpWStr)*2+1;
        LPSTR strbuf = new char[len];
        memset(strbuf,0,len);
        WideCharToMultiByte(CP_OEMCP,0,lpWStr,-1,strbuf,len,NULL,NULL);
        return strbuf;
    #else // For Ansi Version
        LPTSTR ret = new TCHAR[strValue.GetLength()*2+1];
        lstrcpy(ret,strValue.GetBuffer());
        return (LPSTR)ret;
    #endif
    }
    CString strTempInfo;
    LPSTR temp = CStringToChar(strTempInfo);send(m_client, temp , strlen(temp), 0);将CString转化为char*再发送
      

  3.   

    是接收方的问题,buffer也是一个CString?你对它取长度那岂不是0?那怎么保存数据?你改成
    char buff[1024];
    num = recv(m_clients[p], buffer, 1024, 0);
      

  4.   

    Unicode,你就用wchar*字符串,同时带上发送的长度等,接收的时候就也是用wchar*,同时注意接收长度
      

  5.   

    调用其它功能比如GetLength之前必须ReleaseBuffer。
    所以你应该先GetLength,再GetBuffer,然后ReleaseBuffer。
      

  6.   

    嗯,接收方的代码有很大问题,注意GetBuffer要传入设定保留的缓冲区大小,比如1024字节什么的。
    否则CString缓冲区大小是不会变的,ReleaseBuffer后还是原来大小。尽量避免同一行里出现GetBuffer和其它功能。ReleaseBuffer后再用那些功能。
    最好是先放到一个TCHAR数组里,再用CString的构造函数传入数组。
      

  7.   

    先把unicode转换成utf8,对方接收到后再转成unicode就行了