WEB开发网
开发学院软件开发VC 深入 CSocket 编程之阻塞和非阻塞模式 阅读

深入 CSocket 编程之阻塞和非阻塞模式

 2006-07-21 11:15:24 来源:WEB开发网   
核心提示: ProcessAuxQueue 是实质处理 socket 事件的函数,在该函数中有这样一句代码:CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE); 其实也就是由 socket 句柄得到发送事件通

ProcessAuxQueue 是实质处理 socket 事件的函数,在该函数中有这样一句代码:

CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE);

其实也就是由 socket 句柄得到发送事件通知消息的 socket 指针 pSocket:从 m_pmapSocketHandle 中查找(见 1 )!

最后, WSAGETSELECTEVENT(lParam) 会取出事件类型,在一个简单的 switch 语句中判断事件类型并调用事件处理函数。在这里,事件类型是 FD_ACCEPT ,当然就调用 pSocket->OnAccept !

结束语

Server 端 socket 处于阻塞调用模式下,它必须在一个新创建的线程中工作,防止主线程被阻塞。

当有多个 Client 端 socket 与 Server 端 socket 连接及通信时, Server 端采用阻塞模式就显得不适合了,应该采用非阻塞模式 , 利用 socket 事件 的消息机制来接受多个 Client 端 socket 的连接请求并进行通信。

在非阻塞模式下,利用 CSocketWnd 作为所有 sockets 的消息池,是实现 socket 事件 的消息机制的关键技术。文中存在用词不妥和可能存在的技术问题,请大家原谅,也请批评指正,谢谢!

注:

  1. 当前模块状态——用于保存当前线程和模块状态的一个结构,可以通过 AfxGetThreadModule() 获得。AFX_MODULE_THREAD_STATE 在 CSocket 重新定义为 _AFX_SOCK_THREAD_STATE 。
  2. socket 类型——在 TCP/IP 协议中, Client/Server 网络程序采用 TCP 协议:即 socket 类型为 SOCK_STREAM ,它是可靠的连接方式。在这里不采用 UDP 协议:即 socket 类型为 SOCK_DGRAM ,它是不可靠的连接方式。

源代码参考:

  1. http://www.codeproject.com/internet/SocketFileTransfer.asp 采用 CSocket 类编写的基于 Client/Server 的网络文件传输程序,它是基于阻塞模式的 Client/Server 端网络程序典型示例。
  2. http://www.codeguru.com/Cpp/I-N/network/messaging/article.php/c5453 采用 CSocket 类编写的基于 Client/Server 的网络聊天程序,它是基于非阻塞模式的 Client/Server 端网络程序典型示例。

参考资料:

  • Microsoft MSDN Library – January 2001
  • 《Windows 网络编程》 清华大学出版社

上一页  1 2 3 4 5 

Tags:深入 CSocket 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接