主要代码如下bool C聊天室1Dlg::initSocket(void)
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox(_T("套接字创建失败"));
return false;
}
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); int retVal;
retVal=bind(m_socket,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
if(SOCKET_ERROR==retVal)
{
closesocket(m_socket);
MessageBox(_T("套接字绑定失败"));
return false;
} return true;
}DWORD WINAPI C聊天室1Dlg::RecvProc(LPVOID lpParameter)
{
RECVPARAM *pRecvParam=(RECVPARAM*)lpParameter;
HWND hWnd=pRecvParam->hWnd;
SOCKET sock=pRecvParam->sock;
char recvBuf[200];
char resultBuf[200];
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR_IN);
while(true)
{
int retVal=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR==retVal)
{
AfxMessageBox(_T("接受数据错误"));
break;
}
else
{
sprintf(resultBuf,"%s said: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessageW(hWnd,WM_RECVDATA,0,(LPARAM)resultBuf);
}
return 0;
}
} LRESULT C聊天室1Dlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
CString recvData=(TCHAR*)lParam;
CString temp;
GetDlgItemText(IDC_EDIT1,temp);
temp+="/r/n";
temp+=recvData;
SetDlgItemText(IDC_EDIT1,temp); return 1;
} void C聊天室1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dword;
CIPAddressCtrl *pIPAddr=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);
pIPAddr->GetAddress(dword); SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(dword);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); CString strSend;
GetDlgItemText(IDC_EDIT1,strSend);
sendto(m_socket,(char*)(LPCTSTR)strSend,_tcslen(strSend)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); SetDlgItemText(IDC_EDIT1,_T(""));//每次在输出后编辑框也不能清空,为什么

}

解决方案 »

  1.   

    你发送端和接收端不一致,你发送数据是Unicode编码,你接收到用char*来接收的
      

  2.   

    Google -> ::WideCharToMultiByte()
      

  3.   

    SetDlgItemText(IDC_EDIT1,_T(""));//每次在输出后编辑框也不能清空,为什么
    UpdateData(FALSE);//把变量数据传给控件你的发送端使用 CString strSend;
    接收端使用     char recvBuf[200];
    可能在类型转换的过程中存在问题,导致乱码   
      

  4.   

    不是UpdateData的问题,加了那句也没用,,还有有没有哪位能帮忙改好啊,,实在是改不来了
      

  5.   

    DWORD WINAPI C聊天室1Dlg::RecvProc(LPVOID lpParameter)
    {
        RECVPARAM *pRecvParam=(RECVPARAM*)lpParameter;
        HWND hWnd=pRecvParam->hWnd;
        SOCKET sock=pRecvParam->sock;
        char recvBuf[200];
        TCHAR wrecvBuf[200];
        TCHAR resultBuf[200];
        SOCKADDR_IN addrFrom;
        int len=sizeof(SOCKADDR_IN);
        while(true)
        {
            int retVal=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
            if(SOCKET_ERROR==retVal)
            {
                AfxMessageBox(_T("接受数据错误"));
                break;
            }
            else
            {
                int ncount = MultiByteToWideChar(CP_ACP, 0,recvBuf, -1, NULL, 0);
                ncount = MultiByteToWideChar(CP_ACP, 0, recvBuf, -1, wrecvBut, 
                          static_cast<int>(ncount));            sprintf(resultBuf,"%s said: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
                ::PostMessageW(hWnd,WM_RECVDATA,0,(LPARAM)resultBuf);
            }
            return 0;
        }
    }
      

  6.   

    DWORD WINAPI C聊天室1Dlg::RecvProc(LPVOID lpParameter)
    {
      RECVPARAM *pRecvParam=(RECVPARAM*)lpParameter;
      HWND hWnd=pRecvParam->hWnd;
      SOCKET sock=pRecvParam->sock;
      char recvBuf[200];
      TCHAR wrecvBuf[200];
      TCHAR resultBuf[200];
      SOCKADDR_IN addrFrom;
      int len=sizeof(SOCKADDR_IN);
      while(true)
      {
      int retVal=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
      if(SOCKET_ERROR==retVal)
      {
      AfxMessageBox(_T("接受数据错误"));
      break;
      }
      else
      {
      int ncount = MultiByteToWideChar(CP_ACP, 0,recvBuf, -1, NULL, 0);
      ncount = MultiByteToWideChar(CP_ACP, 0, recvBuf, -1, wrecvBut,  
      static_cast<int>(ncount));  wsprintf(resultBuf,L"%s said: %s",inet_ntoa(addrFrom.sin_addr),wrecvBut);
      ::PostMessageW(hWnd,WM_RECVDATA,0,(LPARAM)resultBuf);
      }
      return 0;
      }
    }
      

  7.   

    先用英文调试在MBCS下%s表示MBCS,%S表示Unicode,
    在Unicode下%S表示MBCS,%s表示Unicode。
      

  8.   

     试试这个呢       CEdit *pedit=GetDlgItem(IDC_EDIT1);
    pedit->Clear();UpdateData(FALSE);