深入了解异步套接字

原创 2001年11月21日 20:10:00

 

深入了解异步套接字

 CAsyncSocket异步套接字是MFC封装的SOCKET的类。

只有在三种条件下,才会发出FD_WRITE通知:
1、使用connect或WSAConnect,一个套接字首次建立了连接;
2、使用accept或WSAAccept,套接字被接受以后;
3、若send、WSASend、sendto或WSASendTo操作失败,返回了WSAEWOULDBLOCK错误

,而且缓冲区的空间变得可用。
因此,一个应用程序自收到FD_WRITE消息开始,便认为自己必然能在一个套接字

上发出数据。
所以系统是通过掩码(例:FD_WRITE)来通知异步套接字消息响应函数的。


在实例程序中,经过设置断点调试得知系统会在如下的函数中处理异步消息:
void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)
{
 if (wParam == 0 && lParam == 0)
  return;

 // Has the socket be closed?
 CAsyncSocket* pSocket =

CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE);

 // If yes ignore message
 if (pSocket != NULL)
  return;

 pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, FALSE);
 if (pSocket == NULL)
 {
  // Must be in the middle of an Accept call
  pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET,

FALSE);
  ASSERT(pSocket != NULL);
  pSocket->m_hSocket = (SOCKET)wParam;
  CAsyncSocket::DetachHandle(INVALID_SOCKET, FALSE);
  CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket,

FALSE);
 }

 int nErrorCode = WSAGETSELECTERROR(lParam);
 switch (WSAGETSELECTEVENT(lParam))
 {
 case FD_READ://如果来的异步消息FD_READ,就准备触发OnReceive() 函数
  {
   DWORD nBytes;
   if (!pSocket->IOCtl(FIONREAD, &nBytes))
    nErrorCode = WSAGetLastError();
   if (nBytes != 0 || nErrorCode != 0)
    pSocket->OnReceive(nErrorCode);
  }
  break;
 case FD_WRITE:
  pSocket->OnSend(nErrorCode);
  break;
 case FD_OOB:
  pSocket->OnOutOfBandData(nErrorCode);
  break;
 case FD_ACCEPT:
  pSocket->OnAccept(nErrorCode);
  break;
 case FD_CONNECT:
  pSocket->OnConnect(nErrorCode);
  break;
 case FD_CLOSE:
  pSocket->OnClose(nErrorCode);
  break;
 }
}
从以上的代码可以看出,MFC是通过DoCallBack()这个函数来处理异步网络事件。
当我们用
 AsyncSelect(FD_READ);的话,一旦成功,系统将会触发函数

OnReceive(nErrorCode);
 同样FD_WRITE对应函数OnSend(nErrorCode);
 同样FD_ACCEPT对应函数OnAccept(nErrorCode);
 同样FD_CONNECT对应函数OnConnect(nErrorCode);
 同样FD_CLOSE对应函数OnClose(nErrorCode);
 同样FD_OOB对应函数OnOutOfBandData(nErrorCode);

进程间通信系列 之 socket套接字实例

进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间...
  • iamonlyme
  • iamonlyme
  • 2013年11月13日 09:46
  • 2075

异步套接字实现

TCP 异步套接字,UDP异步套接字封装和使用 1.tcp为有连接的套接字,客户端套接字断开连接的时候服务端会自动断开接受,但服务端断开连接客户端接受线程一直运行,暂没办法解决。 2.tcp套接字可重...
  • wszde2
  • wszde2
  • 2016年01月28日 17:15
  • 321

深入了解MySQL的索引(一)

(一)关于存储引擎               创建合适的索引是SQL性能调优中最重要的技术之一。在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,...
  • qq_27291877
  • qq_27291877
  • 2015年05月06日 21:42
  • 660

套接字 同步 异步

多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接...
  • minglingji
  • minglingji
  • 2012年05月09日 16:26
  • 2588

写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别

当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事。 《 IO - 同步,异步,阻塞,非阻塞 》是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的...
  • fuyuehua22
  • fuyuehua22
  • 2014年07月30日 17:58
  • 2097

深入了解路由器

路由器是什么  是什么把网络相互连接起来?是路由器。路由器是互联网络的枢纽、"交通警察"。目前路由器已经广泛应用于各行各业,各种不同档次的产品已经成为实现各种骨干网内部连接、骨干网间互联和骨干网与互联...
  • feijj2002_
  • feijj2002_
  • 2007年04月02日 22:46
  • 1286

网络编程——基于消息的异步套接字编程

Windows套接字在两种模式下执行I/O操作,一种是阻塞模式,一种是非阻塞模式。在阻塞模式下,在I/O操作完成之前,执行I/O操作的Winsock函数会一直等待下去,不会立即返回程序,将控制权交回程...
  • Sayesan
  • Sayesan
  • 2015年02月04日 15:39
  • 1039

使用异步套接字模式进行Windows网络编程

文章转摘自互联网。 使用异步套接字模式进行Windows网络编程 上面我们使用多线程技术解决了阻塞套接字模式的阻塞问题。微软提供了另外一种不使用多线程技术解决阻塞问题的方法,即异步套接字模式。 ...
  • u011384468
  • u011384468
  • 2013年07月12日 13:54
  • 1067

深入理解Tomcat

简介tomcat是一个web服务器,运行jsp和servlet,使用HTTP与客户端(通常是浏览器)进行通信。构成下图是tomcat的架构,可以看出:核心内容是Connector和Container组...
  • u010066934
  • u010066934
  • 2016年06月14日 14:59
  • 3133

深入理解Hibernate

映射一对多关联关系一对多双向关联关系映射例子 用户与订单关系 customer表和order表 order表有个一个字段是customerid那么在用户的entity中就存在一个set来存放订单...
  • chenjianandiyi
  • chenjianandiyi
  • 2016年09月16日 18:07
  • 752
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入了解异步套接字
举报原因:
原因补充:

(最多只允许输入30个字)