我写的聊天程序,用的UDP协议,一个主线程,和一个线程。
为什么用reavfrom接收的信息总是不全,信息总是隔个字符才收到一个。
比如:我发送abcdef字符串,在我接收的字符数组里char[0]='a',char[1]为空,char[2]='b',char[3]又为空,char[4]='c',char[5]又为空,然后以后的全都为空了。

解决方案 »

  1.   

    发过来的是Unicode,两个字节表示1个字符。
      

  2.   

    你直接把缓冲区指针转成LPWSTR类型就能看到正确的字符串了。
      

  3.   

    具体改怎么改呢?能不能详细点?
    我接收的数组声明为:char recvBuf[200];
    接收信息的代码为:recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
    麻烦说详细一点哈。。
    谢谢!
      

  4.   

    发送的可能是unicode。具体可以看看项目的属性是否是多字节。如果是unicode需要转一下转成ansi的。要不然就在收后再做处理。
      

  5.   

    我是以CString对象发送的,代码如下:
    CString sendStr("");
    GetDlgItemText(IDC_EDIT_SEND,sendStr);
    sendto(m_socket,((const char *)((LPCTSTR)sendStr)),sendStr.GetLength()*2,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
    然后用字符数组储存接收到的数据:
    char   recvBuf[200];
    recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len); 调试的时候,得到sendStr中的值为原来的字符串,但recvBuf数组的字符就像上面我说那样了。
    麻烦高手说一下我改怎么改,看上面几楼的回复,我还是不知道怎么改啊~~
    麻烦改一下啊,加上代码,尽量详细点,谢谢!!!
      

  6.   

    将recvBuf类型改为wchar_t试试。
      

  7.   

    我改过的,不行的!
    我的解决办法是将sendto函数的第3个参数改成sendStr.GetLength()*2,但是这样浪费了recvBuf一半的字符空间!因为它接收时总是一个字符有,下个字符就为空了。
    有其它的解决方法没?
      

  8.   

    CString recvString = (LPTSTR)recvBuf;
      

  9.   

    接收数据的后面加上这行代码,如果不行,则可能你的发送端是Unicode程序而接收端是非Unicode程序,如果是VS2005的项目,设置一下项目属性,把两个程序用统一的字符集就可以了。
      

  10.   

    char *UnicodeToAnsi(TCHAR *lpszSource,char *pszConvert)
    {
    static char szConvert[DEF_COM_BUF] = {0};
    DWORD dwMinSize;
    try{
    ZeroMemory(szConvert, sizeof(szConvert)); dwMinSize = WideCharToMultiByte(CP_OEMCP, NULL, lpszSource, -1, NULL, 0, NULL, FALSE); if (dwMinSize < DEF_COM_BUF) {
    WideCharToMultiByte(CP_OEMCP, NULL, lpszSource, -1, szConvert, dwMinSize * sizeof(char), NULL, FALSE);
    if (pszConvert)
    strcpy_s(pszConvert,strlen(szConvert) + 1, szConvert);
    }
    else{
    strcpy_s(pszConvert, DEF_COM_BUF-1, szConvert);
    g_LogFile->TraceLog(__FILE__, __LINE__, _T("[ERROR] : INSUFFICIENT_BUFFER"));
    }
    }
    catch (CMemoryException* pEx) {
    TCHAR  szError[DEF_TEMP_BUF] = {0};
    pEx->GetErrorMessage(szError, DEF_TEMP_BUF);
    g_LogFile->TraceLog(__FILE__, __LINE__, _T("[ERROR] : Memory exception:[%s]"), szError);
    pEx->Delete();
    }

    return szConvert;
    }加入以上函数(需要稍加修改),sendto(m_socket,((const   char   *)(UnicodeToAnsi(sendStr.GetBuffer())),sendStr.GetLength(),0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR)); 试试这样.