none
CAsyncSocket无法收到OnReceive RRS feed

  • 问题

  • CAsyncSocket的实现主要是依赖于Windows Socket API中的WSAAsyncSelect将Socket事件与一个窗口绑定,

    当特定的Socket事件产生后Socket就会发消息到与之绑定的窗口,这样实现异步效果的。

    现在有一个怪事,我们的软件在某一个用户的机器上经常出现不能收到OnRecevice事件的情况(在其他人的机器上都是OK的)

    当这种怪事发生后,我Attach到进程中获取Socket的标识和与之绑定的窗口句柄值。

    获取得这两个值后,我自己写一个小程序,模拟Socket事件产生向窗口发送一个FD_READ事件。如下:

    PostMessage(hwnd, WM_SOCKET_NOTIFY, socket, FD_READ);

    (注:WM_SOCKET_NOTIFY是MFC中CAsyncSocket内部实现事件通知的消息。)

    然后Socket又可以正常开始收消息了,然后可能过了很长一段时间后又不可以了。如上面再模拟发一个消息又OK了。

    太怪了。

     

    我注意到WSAAsyncSelect的Remark中有这样一段话:

    The WS2_32.DLL will not continually flood an application with messages for a particular network event. Having successfully posted notification of a particular event to an application window, no further message(s) for that network event will be posted to the application window until the application makes the function call that implicitly reenables notification of that network event.

     

    大概意思就是:对于特定的网络事件WS2_32.DLL不会持续的发送消息,事件一旦通知一个窗口后,程序必须调用对应的函数来隐式的重新启用消息通知,否则窗口将不会再收到包含该网络事件的消息。对于FD_READ事件上面指的函数就是recv, recvfrom, WSARecv, or WSARecvFrom.

     

    但是在们的程序中进入OnRecevice事件响应函数中第一个调用的函数就是Recevice(...),其内部就是调用recv的。

     

    所以不知道还有什么情况可以让Socket不再发送通知消息到窗口上。 注意,在别人的机器上都是没有问题的。只有在某一个特定的机器上有这个问题。






    2011年6月19日 7:20

答案