今天参考《VC++深入详解》上的一个例子,写了这个聊天程序,运行正常,但是没有达到预定的目的,不能进行正常的聊天,找了好久不知道什么原因,哪位有兴趣的话帮我看看是什么问题。我调试感觉是接收端的消息响应函数没有正常调用,或者是线程同步的问题。
里面主要的几个函数如下:BOOL CChatDlg::InitSocket()   //套接字初始化函数
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)   //辅助线程入口函数
void CChatDlg::OnRecvData(WPARAM wParam, LPARAM lParam)    //接收数据消息响应函数
void CChatDlg::OnBtnSend()     //发送按钮响应函数源代码到这儿去下载下
http://download.csdn.net/source/2710931    

解决方案 »

  1.   

    判断发送,接收成功没。失败的话WSAGetLastError()的值是多少
      

  2.   

    你的线程返回值的指针有没有自定义一个结构体传给lpParameter?
      

  3.   


    应该是接收没有成功,貌似retval = recvfrom(sock , recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len);以后的代码都没有执行。while(TRUE)
    {
    //接收数据
    retval = recvfrom(sock , recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len);
    if(SOCKET_ERROR == retval)
    break;
    sprintf(tempBuf, "%s 说:%s", inet_ntoa(addrFrom.sin_addr), recvBuf);
    ::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)tempBuf);
    }所以接收数据消息响应函数也没有执行。
      

  4.   

    你有没有将lpParameter这指针指向自定义的结构体的?
      

  5.   


    程序当中的RECVPARAM结构体就是我自己定义的,包含两个成员:hwnd 和 sock  。
      

  6.   

    这个我最近也编过...
    我是用VS2008编的,遇到CSring转char*的问题,把字节转换过来后,跟踪一下内存
    发现发送的字符是以这种形式发送的
    例如
    ASCII码:
    69 00 73 00 52 00
    即出现了很多00,在接收端被误认为截断了,所以我做这个时也出问题了,到现在还没解决!呵呵呵
      

  7.   


    我的意思是你 retval = recvfrom(sock , recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len)的SOCK已经指向到你这自定义的结构体RECVPARAM里的SOCK成员没?
    SOCKET sock=((RECVPARAM*)lpParameter)->sock;这句你while循环前有了没?
    不好意思,你源程序要分的,没下你源程序看。
      

  8.   


    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); char recvBuf[200];
    char tempBuf[300];
    int retval; while(TRUE)
    {
    //接收数据
    retval = recvfrom(sock , recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len);
    if(SOCKET_ERROR == retval)
    break;
    sprintf(tempBuf, "%s 说:%s", inet_ntoa(addrFrom.sin_addr), recvBuf);
    ::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)tempBuf);
    }
    return 0;
    }
    有的啊,就在线程函数里。不好意思,这些天放假都没来上了。
      

  9.   

    呵呵 。。2008下面默认使用unicode响应。。你可以修改字符集就可以了。还有就是做转换顺便给出我写的一个转换函数void ConvertString(LPSTR AscIIString,LPWSTR UnicodeString,BOOL type/*=1*/)
    { if(type)
    {
    int Unicodelen=MultiByteToWideChar(CP_ACP,0,AscIIString,-1,NULL,0);
    MultiByteToWideChar(CP_ACP,0,AscIIString,-1,UnicodeString,Unicodelen); }
    else
    {
    int ASCIILen=WideCharToMultiByte(CP_ACP,0,UnicodeString,-1,NULL,0,NULL,NULL);
    WideCharToMultiByte(CP_ACP,0,UnicodeString,-1,AscIIString,ASCIILen,NULL,NULL);
    }
    }
    如果是CSTRING赋值到第2个参数。。直接(lpwstr)(lpctstr)强制转换下就可以了