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

        CSocket是对CAsyncSocket的一个再次封装,它将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就是通过继承上述三个虚函数,在函数内部获取调用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基本编程步骤都是一致的,不同只是它们两者之间的内部的处理逻辑。比如上一文中,我们自定义了一个CMySocket类继承自CAsyncSocket,如果我想要使用CSocket类,只需将上一文中的CMySocket父类改成CSocket:

class CMySocket : public CSocket
{
…
}

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

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


CSocket是一个封装了Windows Socket API的C++类库,用于实现网络通讯。下面简单介绍如何使用CSocket实现服务端客户端信息通讯。 1. 创建服务端Socket 首先,我们需要创建一个服务端Socket,以便客户端能够连接到它。在Windows系统中,我们可以使用Windows Socket API中的socket函数来创建Socket。而在CSocket中,我们可以使用Create函数来创建Socket。具体代码如下: ``` // 创建服务端Socket CSocket serverSocket; serverSocket.Create(PORT_NUMBER); // PORT_NUMBER为端口号 serverSocket.Listen(); ``` 2. 等待客户端连接 服务端创建好Socket后,需要等待客户端连接。在Windows Socket API中,我们可以使用accept函数来等待客户端连接。而在CSocket中,我们可以使用Accept函数来等待客户端连接。具体代码如下: ``` // 等待客户端连接 CSocket clientSocket; serverSocket.Accept(clientSocket); ``` 3. 发送和接收信息 服务端客户端连接成功后,就可以开始进行信息通讯了。在Windows Socket API中,我们可以使用send和recv函数来发送和接收信息。而在CSocket中,我们可以使用Send和Receive函数来发送和接收信息。具体代码如下: ``` // 发送信息 CString message = "Hello, Client!"; clientSocket.Send(message, message.GetLength()); // 接收信息 CString receivedMessage; clientSocket.Receive(receivedMessage, 1024); ``` 4. 关闭Socket 信息通讯完成后,我们需要关闭Socket。在Windows Socket API中,我们可以使用closesocket函数来关闭Socket。而在CSocket中,我们可以使用Close函数来关闭Socket。具体代码如下: ``` // 关闭Socket serverSocket.Close(); clientSocket.Close(); ``` 以上就是使用CSocket实现服务端客户端信息通讯的基本步骤。需要注意的是,以上代码只是一个简单的示例,实际应用中还需要考虑更多的异常处理和安全性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值