控制台如何分派windows消息(100分只给一人)

周晓荣 2011-09-23 10:56:41
我在控制台的main中创建了一个新线程,在线程中进行消息循环
接着用WSAAsyncSelect将套接字绑定到新线程中的窗口句柄g_msg_hwnd中
但是在连接建立之后(确定能建立),网络事件发生了,但绑定窗口却没收到任何消息
如果是自己postmessage给窗口,窗口是确实能收到,能回调的。
现在的问题就是,WSAAsyncSelect绑定的窗口无法收到任何消息。

在win32程序中无此问题。。。

DWORD WINAPI MsgThread(LPVOID lpvoid)
{
g_msg_hwnd = CreateSocketWindow( ::GetModuleHandle(NULL) );

if (NULL == g_msg_hwnd)
return 0;

MSG msg;
while(1)
{
GetMessage(&msg, g_msg_hwnd, 0, 0);

if (msg.message == WM_QUIT)
{
UnInitAsyncSocket();
return 1;
}

TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
...全文
78 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-09-23
  • 打赏
  • 举报
回复
你CreateWindow创建了窗口没有?WSAAsyncSelect绑定了SOCKET和HWND了没有?窗口的回调函数里处理了消息没有?从这三个方面检测一下看看~
smwhotjay 2011-09-23
  • 打赏
  • 举报
回复
WSASynSelect(g_hwnd,FD_CONNECT 时貌似后返回值.可以判断下是否成功.
我好久没碰socket了..这个月来都是分析别人蛋疼的项目代码.我成了客户端程了我. - -!
smwhotjay 2011-09-23
  • 打赏
  • 举报
回复
基于Event的异步模型. 只能一线程等64个event.很蛋疼。,
WSASynSelect 却可以无限连接. 只是窗口消息速度有限。处理不了大量的sock事件消息.因为只在一个窗口线程里处理的.当然也可以把sock消息放到另一个work线程里处理.

你把重要的东西输出下.debug下就应该能找到原因.比如.你创建窗口线程时.可能这个线程还没跑起来.窗口还没建立.所以那个全局hwnd句柄就没正确值. 而你主线程已经执行了WSASynSelect(g_hwnd,FD_CONNECT|.....,sock); 所以后面会窗体收不到sock消息拉.我以前遇到过.先是主线程Sleep几秒,等待窗口线程大概创建ok后再执行窗口与sock绑定关注事件. 你的问题应该就在这里吧.
dfasri 2011-09-23
  • 打赏
  • 举报
回复
WSAAsyncSelect只是向窗口句柄发送消息嘛, 控制台的窗体需要有消息, 但你加不了消息处理, 所以你定义的WM_SOCKET消息是不能够收到的, 收到也不处理
周晓荣 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kevin_perkins 的回复:]
这没有什么奇怪的吧。绑定窗口句柄,靠消息响应网络事件,本来就是适合于Win32窗口程序的模型。
建议楼主用基于Event的异步模型,没有窗口句柄,就可以解决这个问题,窗口程序和控制台程序均适用。
[/Quote]

WSAAsyncSelect模型我也不打算用了,只是,不把问题搞清楚不舒服

就是想知道,在控制台下如何使WSAAsyncSelect模型一样适应
Kevin_Perkins 2011-09-23
  • 打赏
  • 举报
回复
这没有什么奇怪的吧。绑定窗口句柄,靠消息响应网络事件,本来就是适合于Win32窗口程序的模型。
建议楼主用基于Event的异步模型,没有窗口句柄,就可以解决这个问题,窗口程序和控制台程序均适用。
周晓荣 2011-09-23
  • 打赏
  • 举报
回复

SOCKET connect_socket = ConnectToAddr("127.0.0.1", 4444, SOCK_STREAM);//笔误

ConnectToAddr和ListenConnect都是阻塞方式
周晓荣 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
贴出你完整的console程序
[/Quote]

服务端

int _tmain(int argc, _TCHAR* argv[])
{
InitAsyncSocket();
SOCKET server_socket = ListenConnect(4444, SOCK_STREAM, 10);

cout<<"send tcp msg length:"<<SendTCPMsg(server_socket, "send test")<<endl;

Sleep(5000);
system("pause");
return 0;
}

客户端
[code=c/c++]
int _tmain(int argc, _TCHAR* argv[])
{
InitAsyncSocket();
SOCKET connect_socket = ConnectToAddr("127.0.0.1", 4444, SOCK_DGRAM);
SetMsgRecvFunc(connect_socket, ReadMsg);

system("pause");
return 0;
}
[/code]
Eleven 2011-09-23
  • 打赏
  • 举报
回复
贴出你完整的console程序
周晓荣 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 smwhotjay 的回复:]

基于Event的异步模型. 只能一线程等64个event.很蛋疼。,
WSASynSelect 却可以无限连接. 只是窗口消息速度有限。处理不了大量的sock事件消息.因为只在一个窗口线程里处理的.当然也可以把sock消息放到另一个work线程里处理.

你把重要的东西输出下.debug下就应该能找到原因.比如.你创建窗口线程时.可能这个线程还没跑起来.窗口还没建立.所以那个全局hwnd句……
[/Quote]
果然,线程还没跑起来。

谢谢了。
gameslq 2011-09-23
  • 打赏
  • 举报
回复
F5进行代码调试跟踪下,也可以用TRACE打出消息

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧