收藏 分享(赏)

扔掉Socket实现网络编程new.doc

上传人:dzzj200808 文档编号:2282772 上传时间:2018-09-09 格式:DOC 页数:6 大小:33.50KB
下载 相关 举报
扔掉Socket实现网络编程new.doc_第1页
第1页 / 共6页
扔掉Socket实现网络编程new.doc_第2页
第2页 / 共6页
扔掉Socket实现网络编程new.doc_第3页
第3页 / 共6页
扔掉Socket实现网络编程new.doc_第4页
第4页 / 共6页
扔掉Socket实现网络编程new.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。许多文章都曾经介绍过用 VC+进行 Socket 编程的方法。但由于都是直接利用动态连接库 wsock32.dll 进行操作,实现比较繁琐。其实,VC+的 MFC 类库中提供了 CAsyncSocket 这样一个套接字类,用它来实现Socket 编程,是非常方便的。 客户端 创建一个 Dialog Based 项目:CSockClient。设计一对话框,增加 ID_Connect(连接)、ID_Send(发送)、 ID_Exit(关闭)按钮,增加 ListBox 控件 IDC_LISTMSG 和 Edit 控件IDC_ED

2、ITMSG,并按下表在 ClassWizard 中为 CCSockClientDlg 类添加变量。 Control ID Type Member IDC_EDITMSG CEdit m_MSG IDC_LISTMSG ClistBox m_MSGS 在 MySock.ccp 中添加以下代码: #include “CSockClient.h“ #include “CSockClientDlg.h“ 在 MySock.h 中添加以下代码: public: BOOL m_bConnected; UINT m_nLength; char m_szBuffer4096; 在 MySock.ccp 中重载

3、各函数 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

4、*)AfxGetApp(); CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- m_pMainWnd; pDlg- m_MSGS.InsertString(0,m_szBuffer); memset(m_szBuffer,0,sizeof(m_szBuffer); CAsyncSocket:OnReceive(nErrorCode); void MySock:OnSend(int nErrorCode) Send(m_szBuffer,m_nLength,0); m_nLength=0; memset(m_szBuffer,0,sizeof(m_szB

5、uffer); /继续提请一个“读”的网络事件,接收 Server 消息 AsyncSelect(FD_READ); CAsyncSocket:OnSend(nErrorCode); void MySock:OnConnect(int nErrorCode) if (nErrorCode=0) m_bConnected=TRUE; CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp(); CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- m_pMainWnd; memcpy(m_szBuffer,“Con

6、nected to “,13); strncat(m_szBuffer,pDlg- m_szServerAdr, sizeof(pDlg- m_szServerAdr); pDlg- m_MSGS.InsertString(0,m_szBuffer); AsyncSelect(FD_READ);/提请一个“读”的网络事件,准备接收 CAsyncSocket:OnConnect(nErrorCode); 建一对话框 IDD_Addr,用来输入 IP 地址和 Port;增加两个 Edit 控件:IDC_Addr、IDC_Port 按下表在 ClassWizard 中为 CAddrDlg 类添加变量

7、。 Control ID Type Member IDC_Addr CString m_Addr IDC_Port Int m_Port 在 CSockClientDlg.ccp 中添加代码: #include “AddrDlg.h“ protected: int TryCount; MySock m_clientSocket; UINT m_szPort; public: char m_szServerAdr256; 双击 IDD_CSOCKCLIENT_DIALOG 对话框中的“连接” 按钮,添加以下代码: m_clientSocket.ShutDown(2); m_clientSocke

8、t.m_hSocket=INVALID_SOCKET; m_clientSocket.m_bConnected=FALSE; CAddrDlg m_Dlg; m_Dlg.m_Port=1088;/默认端口 1088 if (m_Dlg.DoModal()=IDOK m_szPort=m_Dlg.m_Port; SetTimer(1,1000,NULL);/建立计时器,每 1 秒尝试连接一次 TryCount=0; 添加 Windows 消息 WM_TIMER 响应函数 OnTimer void CCSockClientDlg:OnTimer(UINT nIDEvent) if (m_clien

9、tSocket.m_hSocket=INVALID_SOCKET) BOOL bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT); if(!bFlag) AfxMessageBox(“Socket Error!“); m_clientSocket.Close(); PostQuitMessage(0); return; m_clientSocket.Connect(m_szServerAdr,m_szPort); TryCount+; if (TryCount =10 | m_clientSocket.m_bConnected) Kill

10、Timer(1); if (TryCount =10) AfxMessageBox(“Connect Failed!“); return; CDialog:OnTimer(nIDEvent); 双击 IDD_CSOCKCLIENT_DIALOG 对话框中的“发送” 按钮,添加以下代码: void CCSockClientDlg:OnSend() if (m_clientSocket.m_bConnected) m_clientSocket.m_nLength=m_MSG.GetWindowText (m_clientSocket.m_szBuffer, sizeof(m_clientSocke

11、t.m_szBuffer); m_clientSocket.AsyncSelect(FD_WRITE); m_MSG.SetWindowText(“); 双击 IDD_CSOCKCLIENT_DIALOG 对话框中的“关闭” 按钮,添加以下代码: void CCSockClientDlg:OnExit() m_clientSocket.ShutDown(2); /关闭 Socket EndDialog(0); 运行此项目,连接时输入主机名或 IP 均可,CAsyncSocket 类会自动处理。 服务端 Server 端的编程与 Client 端的类似,下面主要介绍他的 Listen 及 Acc

12、ept 函数。建立一个CNewSocket 类,重载 CAsyncSocket 类的 OnReceive、OnSend 函数,如何进行信息的显示和发送可以参考 Client 程序。本例中采用将收到信息原封不动发回的方法来实现 Echo 功能,代码如下: CNewSocket :OnReceive(int nErrorCOde) m_nLength=Receive(m_szBuffer ,sizeof(m_szBuffer ),0); AsyncSelect(FD_WRITE );/ 直接转发消息 CNewSocket: OnSend(int nErrorCode) Send(m_szBuffe

13、r,m_nLength,0 ); 建立一个 CMyServerSocket 类,重载 CAsyncSocket 类的 OnAccept 函数代码如下: 在 MyServerSocket.h 中声明变量 public:: CNewSocket* m_pSocket; void CMyServerSocket:OnAccept(int nErrorCode) CNewSocket* pSocket = new CNewSocket(); if (Accept(*pSocket ) pSocket- AsyncSelect(FD_READ); m_pSocket=pSocket;else delet

14、e pSocket; 为对话框添加一个“侦听”按钮,添加如下代码: 在 CsockServerDlg.ccp 中声明变量 public: CMyServerSocket m_srvrSocket; void CCSockServerDlg:OnListen() if (m_srvrSocket.m_hSocket=INVALID_SOCKET ) BOOL bFlag=m_srvrSocket.Create (UserPort,SOCK_STREAM,FD_ACCEPT); if (!bFlag) AfxMessageBox(“Socket Error!” ); M_srvrSocket.Cl

15、ose(); PostQuitMessage(0 ); Return; if (!m_srvrSocket。Listen(1) int nErrorCode = m_srvrSocket.GetLastError(); if (nError !=WSAEWOULDBLOCK) AfxMessageBox(“Socket Error!” ); M_srvrSocket.Close(); PostQuitMessage(0 ); Return; CAsyncSocket 类为我们使用 Socket 提供了极大方便。建立 Socket 的 WSAStartup 过程和 bind 过程被简化成为 Create 过程, IP 地址类型转换、主机名和 IP 地址转换的过程中许多复杂的变量类型都被简化成字符串和整数操作,特别是 CAsyncSocket 类的异步特点,完全可以替代繁琐的线程操作。MFC 提供了大量的类库,我们若能灵活的使用他们,便会大大提高编程的效率。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报