今天参考《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
里面主要的几个函数如下: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
解决方案 »
- 达人们, 怎样用MFC开发windows service(系统服务)程序?
- 急求一个不需要用户验证的可以发信给国内邮箱的smtp的服务器地址,在线等
- 各位高手,怎么把一个SDI工程改为MDI
- 急!怎么把记事本NOTEPAD加载到我的程序中,就象翻译软件那样!
- ■■■为什么别人的dll可以用,但自己build却没效果了?■■■
- 为什么我编译时总是
- 请问怎样把B程序里面的类CButtonTest添加到A程序里面中??
- 大家看看这个简单的消息为什么不能传递给视图类,到底错在哪里?
- 请教各位高手!!!!
- 高分求救!!!!!!!哪有这样的主页空间,哪位大侠能告诉我一个.
- writefile并口读写的限制
- 请教颜色叠加的方法
应该是接收没有成功,貌似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);
}所以接收数据消息响应函数也没有执行。
程序当中的RECVPARAM结构体就是我自己定义的,包含两个成员:hwnd 和 sock 。
我是用VS2008编的,遇到CSring转char*的问题,把字节转换过来后,跟踪一下内存
发现发送的字符是以这种形式发送的
例如
ASCII码:
69 00 73 00 52 00
即出现了很多00,在接收端被误认为截断了,所以我做这个时也出问题了,到现在还没解决!呵呵呵
我的意思是你 retval = recvfrom(sock , recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len)的SOCK已经指向到你这自定义的结构体RECVPARAM里的SOCK成员没?
SOCKET sock=((RECVPARAM*)lpParameter)->sock;这句你while循环前有了没?
不好意思,你源程序要分的,没下你源程序看。
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;
}
有的啊,就在线程函数里。不好意思,这些天放假都没来上了。
{ 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)强制转换下就可以了