说起网络编程,大部分人使用的都是 winsocket,我觉得这样不利于初学者来学习,对于初学者来说,应该先学会使用更加方便的socket对象。那么封装了winsocket的有两个MFC类:CSocket、CAsyncSocket。我建议从CAsyncSocket开始学起。
Accept:表示接收一个客户端连接
Socket:表示初始化一个套接字句柄,默认的参数是使用tcp协议
Bind:绑定到本地一个端口,用来监听
Create: 实际上就是内部调用Socket和Bind函数,也就是说使用了Create不能再同时使用Socket和Bind
Connect:连接,用于客户端
Close: 关闭套接字
Listen: 监听端口,用于服务器
Receive: 接收数据,用于tcp协议
ReceiveFrom:接收数据,用于udp协议
Send:发送数据,用于tcp协议
SendTo:发送数据,用于udp协议
ShutDown: 停止本次的数据接收
回调函数:
OnAccept:每当有连接请求时,此函数被调用
OnClose: 每当有连接被关闭时,此函数被调用,nErrorCode为0表示正常关闭,其他为非正常关闭
OnConnect:每当使用了Connect函数时,此函数被调用,nErrorCode为0,表示连接成功,其他表示连接失败
OnReceive: 每当有数据接收,此函数被调用
OnSend: 每当Send函数调用完后,此函数被调用
下面我来讲解服务器的一般流程:
1.加载套接字版本
2.使用协议和绑定端口
3.监听端口
4.接受连接
首先我们来定义一个 CAsyncSocket 全局对象。
CAsyncSocket m_server;
然后在初始化对话框的时候加载套接字::: AfxSocketInit();紧接着使用协议和端口:m_server.Create(10000);//10000为端口号
接下来监听端口:m_server.Listen();
由于CAsyncSocket是异步的,那么我们怎么才能知道有没有连接加入呢?我们注意到这个类是有回调函数的,再仔细看上面的说明,原来有连接都是调用了OnAccept函数。可问题来了,怎么让OnAccept这个回调函数来调用或者说通知到我们呢?再看MSDN的说明:回调函数是protected的而且还是个虚函数,这样一来我们只要继承这个类,然后重写这个函数就可以达到我们的目的了!