socket 编程用法---- 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。由于C++语言对底层操作的优越性,许多文章都曾经介绍过用VC++进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll 进行操作,实现比较繁琐。其实,VC++的MFC 类库中提供了CAsyncSocket 这样一个套接字类,用他来实现Socket 编程,是非常方便的。 ---- 本文将用一个Echo 例程来介绍CAsyncSocket 类的用法。 ---- 一. 客户端 ---- 1. 创建一个Dialog Based 项目:CSockClient。 ---- 2. 设计对话框 ---- 去掉Ok 和Cancle 两个按钮,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件 IDC_LISTMSG 和Edit 控件 IDC_EDITMSG,并按下表在ClassWizard 中为 CCSockClientDlg 类添加变量。 Control ID Type Member IDC_EDITMSG CEdit m_MSG IDC_LISTMSG ClistBox m_MSGS ---- 3. CAsyncSocket 类用DoCallBack 函数处理 MFC 消息,当一个网络事件发生时,DoCallBack 函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect 函数。由于MFC 把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下: ---- 以 Public 方式继承 CAsyncSocket 类,生成新类MySock; ---- 为 MySock 类添加虚函数 OnReceive、OnConnect、OnSend ---- 4. 在MySock.ccp 中添加以下代码 #include "CSockClient.h" #include "CSockClientDlg.h" ---- 5. 在MySock.h 中添加以下代码 public: BOOL m_bConnected; //是否连接 UINT m_nLength; //消息长度 char m_szBuffer[4096]; //消息缓冲区 ---- 6. 在MySock.ccp 中重载各函数 MySock::MySock() { m_nLength=0; memset(m_szBuffer,0,sizeof(m_szBuffer)); m_bConnected=FALSE; } MySock::~ MySock() { //关闭套接字 if(m_hSocket!=INVALID_SOCKET) Close(); } void MySock::OnReceive(int nErrorCode) { m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0); //下面两行代码用来获取对话框指针 CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp(); CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- >m_pMainWnd; pDlg- >m_MSGS.InsertString(0,m_szBuffer); memset(m_sz...