程序员人生 网站导航

网络编程(58)—— Windows下使用CSocket搭建回声服务端和客户端

栏目:互联网时间:2017-03-09 08:49:55

        CSocket是对CAsyncSocket的1个再次封装,它将CAsyncSocket这类异步不阻塞的socket封装成了同步阻塞的socket。它的实现原理其实很简单,我们应当留意到在CAsyncSocketAcceptSendReceive函数被定义成了虚函数:

virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL );

virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );

virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );

        CSocket就是通过继承上述3个虚函数,在函数内部获得调用WSAGetLastError获得毛病,如果毛病为WSAEWOULDBLOCK说明IO操作未能完成,此时,它将进入消息循环,知道等到该IO事件完成为止。如果伪代码,表示以下:

BOOL CSocket::Accept(…)
{
    CAsyncSocket:: Accept(…)
   {
	if(WSAGetLastError()==WSAEWOULDBLOCK)
       {
	    while(True)
            {
	        MSG msg;
	        if(PeekMessage(&msg,WM_SOCKET_NOTIFY))
	        {
		    if(msg.message== WM_SOCKET_NOTIFY)
		    {
			…
			break;
                    }
                }
            }
        }
	…
     }
     …
  }
  …
}


        其实对使用者来说使用CAsyncSocket和CSocket基本编程步骤都是1致的,不同只是它们二者之间的内部的处理逻辑。比如上1文中,我们自定义了1个CMySocket类继承自CAsyncSocket,如果我想要使用CSocket类,只需将上1文中的CMySocket父类改成CSocket:

class CMySocket : public CSocket
{
…
}

     其他代码不需要任何的改动,我们就可以得到功能相同的服务端和客户端

 Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获得本文源代码:
git checkout NL58


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐