ImageVerifierCode 换一换
格式:DOC , 页数:6 ,大小:33.50KB ,
资源ID:2282772      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-2282772.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(扔掉Socket实现网络编程new.doc)为本站会员(dzzj200808)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

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

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营业执照举报