首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

孙鑫视频中的聊天室应用程序代码,不知哪儿没写对,在VS中调试出错

2012-09-19 
孙鑫视频中的聊天室应用程序代码,不知哪里没写对,在VS中调试出错运行的结果应该是,在对话框中的编辑框内输

孙鑫视频中的聊天室应用程序代码,不知哪里没写对,在VS中调试出错
运行的结果应该是,在对话框中的编辑框内输入字符串和IP地址,同时在接收框中显示本次和上次的字符串,但是现在,同样的代码,在VS2008中运行出来,每次却只能在接收框中显示第一个字符,请大家多多指教啊~~小弟先行谢过各位大虾了!


核心代码如下:

C/C++ code
BOOL CChatDlg::InitSocket(){    m_socket = socket(AF_INET, SOCK_DGRAM, 0);    if(INVALID_SOCKET == m_socket)    {        MessageBoxW(L"套接字创建失败!");        return FALSE;    }    SOCKADDR_IN addrSock;    addrSock.sin_family = AF_INET;    addrSock.sin_port = htons(6000);    addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    int retval = 0;    bind(m_socket, (SOCKADDR*)&addrSock, sizeof(SOCKADDR));    if(SOCKET_ERROR == retval)    {        closesocket(m_socket);        MessageBoxW(L"绑定失败!");        return FALSE;    }    return TRUE;}DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter){    SOCKET sock = ((RECVPARAM*)lpParameter)->sock;    HWND hwnd = ((RECVPARAM*)lpParameter)->hwnd;    delete lpParameter;    SOCKADDR_IN addrFrom;    int len = sizeof(SOCKADDR);    int retval;    char recvBuf[200];    memset(recvBuf,0,200);    char tempBuf[300];    memset(tempBuf,0,300);    while(TRUE)    {         //在此处打断点,发现recvBuf中,只接收输入的字符串的前三个或者四个字符,        //最后一个字符还是以前的某字符串中的字符        retval = recvfrom(sock, recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len);        if(SOCKET_ERROR == retval)        {            break;        }        sprintf_s(tempBuf, 300, "%s说: %s", inet_ntoa(addrFrom.sin_addr), recvBuf);                ::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)tempBuf);    }    return 0;}LRESULT CChatDlg::OnRecvData(WPARAM wParam, LPARAM lParam) //将void 改为 LRESULT{    //str.Format(L"%s", lParam); CSDN上有兄弟说用Format()赋值,    //但这样的话,接收框里就成了乱码了    CString str((char*)lParam);        CString strTemp;    GetDlgItemText(IDC_EDIT_RECV, strTemp);    str += "\r\n";    str += strTemp;    SetDlgItemText(IDC_EDIT_RECV, str);    return 0;}void CChatDlg::OnBnClickedBtnSend(){    // TODO: 在此添加控件通知处理程序代码    DWORD dwIP;    ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);    SOCKADDR_IN addrTo;    addrTo.sin_family=AF_INET;    addrTo.sin_port=htons(6000);    addrTo.sin_addr.S_un.S_addr=htonl(dwIP);    CString strSend;    GetDlgItemText(IDC_EDIT_SEND,strSend);    sendto(m_socket,(char*)(LPCTSTR)strSend,(strSend.GetLength()+1),            0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));    SetDlgItemText(IDC_EDIT_SEND,NULL);}





[解决办法]
CString strSend;
GetDlgItemText(IDC_EDIT_SEND,strSend);

sendto(m_socket,(char*)(LPCTSTR)strSend,(strSend.GetLength()+1), 
0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
------------------------------------------------------
将你的CString转成char[],然后发送出去
[解决办法]
sendto(m_socket,(char*)(LPCTSTR)strSend,(strSend.GetLength()+1), 
0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));

最好不要用字符串,改用char[]试试吧,然后看下发送了多少个字节

热点排行