简单实现一个MFC的socket异步通信(服务端)

这次闲话不说,直接上货

自定义消息,用来接收异步消息

#define WM_SOCKET WM_USER+1

定义服务端监听SOCKET

SOCKET m_servSock;

声明初始化服务端监听SOCKET的方法

BOOL InitNetwork();

定义初始化服务端监听SOCKET的方法

BOOL CpassiveSelectDlg::InitNetwork(){

         WSADATA m_wsaData;

         WSAStartup(MAKEWORD(2,2),&m_wsaData);

         m_servSock=socket(AF_INET,SOCK_STREAM,0);

         sockaddr_in m_servAddr;

         memset(&m_servAddr,0,sizeof(m_servAddr));

         m_servAddr.sin_family=AF_INET;

         m_servAddr.sin_addr.s_addr=htonl(INADDR_ANY);

         m_servAddr.sin_port=htons(atoi("8888"));

         bind(m_servSock,(SOCKADDR*)&m_servAddr,sizeof(m_servAddr));

         listen(m_servSock,5);

         WSAAsyncSelect(m_servSock,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ);

         return TRUE;

}

主要是

WSAAsyncSelect(m_servSock,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ);

这句,为socket注册异步IO事件。

ON_MESSAGE(NETWORK_EVENT,“回调函数”)

然后在回调函数中根据事件类型做出各种操作。

主要操作有很多,都是干什么的,自己自行理解。

事件类型

回调函数原型如下:

void className::FName(WPARAM wParam, LPARAM lParam){

        //调用Winsock API函数,得到网络事件类型

        int iEvent = WSAGETSELECTEVENT(lParam);

        //调用Winsock API函数,得到发生此事件的客户端套接字

        SOCKET CurSock= (SOCKET)wParam;

        switch(iEvent){

                case FD_ACCEPT:         //客户端连接请求事件

                        OnAccept(CurSock);

                        break;

                case FD_CLOSE:          //客户端断开事件:

                        OnClose(CurSock);

                        break;

                case FD_READ:           //网络数据包到达事件

                        OnReceive(CurSock);

                        break;

                case FD_WRITE:         //发送网络数据事件

                        OnSend(CurSock);

                        break;

                default: break;

        }

}

详细的就不写了,这里主要是为自己记录一下,如果有问题的到下方群中,我们再交流学习。


(以上如有不解,请到群内讨论。如果对您有所帮助话,那就点个赞吧,嘻嘻~~)

安利一个特别热心的编程乐园群:624108656

超级热心的群

你可能感兴趣的:(简单实现一个MFC的socket异步通信(服务端))