版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、利用CAsyncSocket类实现Socket编程更新时间:2007-10-20作者:佚名来源:常州vc网本文关键词:CAsyncSocket类socket编程随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。许多文章都曾经介绍过用VC+进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,VC+的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现Socket编程,是非常方便的。客户端创建一个DialogBased项目:CSockClient。设计一对话框,增力口ID_Connect(连接)、ID_S
2、end(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。ControlIDTypeMemberIDC_EDITMSGCEditm_MSGIDC_LISTMSGClistBoxm_MSGS在MySock.ccp中添加以下代码:#includeCSockClient.h#includeCSockClientDlg.h在MySock.h中添加以下代码:public:BOOLm_bConnected;UINTm_nLength;charm_szBuffer
3、4096;在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();voidMySock:OnReceive(intnErrorCode)m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);/下面两行代码用来获取对话框指针CCSockClientApp*pApp=(CCSockClien
4、tApp*)AfxGetApp();CCSockClientDlg*pDlg=(CCSockClientDlg*)pApp-m_pMainWnd;pDlg-m_MSGS.InsertString(0,m_szBuffer);memset(m_szBuffer,0,sizeof(m_szBuffer);CAsyncSocket:OnReceive(nErrorCode);voidMySock:OnSend(intnErrorCode)Send(m_szBuffer,m_nLength,0);m_nLength=0;memset(m_szBuffer,0,sizeof(m_szBuffer);/继
5、续提请一个读”的网络事件,接收Server消息AsyncSelect(FD_READ);CAsyncSocket:OnSend(nErrorCode);voidMySock:OnConnect(intnErrorCode)if(nErrorCode=0)m_bConnected=TRUE;CCSockClientApp*pApp=(CCSockClientApp*)AfxGetApp();CCSockClientDlg*pDlg=(CCSockClientDlg*)pApp-m_pMainWnd;memcpy(m_szBuffer,Connectedto,13);strncat(m_szBuf
6、fer,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类添加变量。ControlIDTypeMemberIDC_AddrCStringm_AddrIDC_PortInt
7、m_Port在CSockClientDlg.ccp中添加代码:#includeAddrDlg.hprotected:intTryCount;MySockm_clientSocket;UINTm_szPort;public:charm_szServerAdr256;双击IDD_CSOCKCLIENT_DIALOG对话框中的连接”按钮,添加以下代码:m_clientSocket.ShutDown(2);m_clientSocket.m_hSocket=INVALID_SOCKET;m_clientSocket.m_bConnected=FALSE;CAddrDlgm_Dlg;m_Dlg.m_Por
8、t=1088;/默认端口1088if(m_Dlg.DoModal()=IDOK&!m_Dlg.m_Add匚IsEmpty()memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr);m_szPort=m_Dlg.m_Port;SetTimer(1,1000,NULL);/建立计时器,每1秒尝试连接一次TryCount=0;添加Windows消息WM_TIMER响应函数OnTimervoidCCSockClientDlg:OnTimer(UINTnIDEvent)(if(m_clientSocket.m_hSocket=INVALID_SOC
9、KET)(BOOLbFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);if(!bFlag)(AfxMessageBox(SocketError!);m_clientSocket.Close();PostQuitMessage(O);return;m_clientSocket.Connect(m_szServerAdr,m_szPort);TryCount+;if(TryCount=10|m_clientSocket.m_bConnected)KillTimer(1);if(TryCount=10)AfxMessageBox(Connect
10、Failed!);return;CDialog:OnTimer(nIDEvent);双击IDD_CSOCKCLIENT_DIALOG对话框中的发送”按钮,添加以下代码:voidCCSockClientDlg:OnSend()(if(m_clientSocket.m_bConnected)(m_clientSocket.m_nLength=m_MSG.GetWindowText(m_clientSocket.m_szBuffer,sizeof(m_clientSocket.m_szBuffer);m_clientSocket.AsyncSelect(FD_WRITE);m_MSG.SetWind
11、owText();)voidCCSockClientDlg:OnExit()m_clientSocket.ShutDown(2);/关闭SocketEndDialog(0);运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理服务端Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。建立一个CNewSocket类,重载CAsyncSocket类的OnReceive、OnSend函数,如何进行信息的显示和发送可以参考Client程序。本例中采用将收到信息原封不动发回的方法来实现Echo功能,代码如下:CNewSocket:OnRec
12、eive(intnErrorCOde)m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);AsyncSelect(FD_WRITE);/直接转发消息CNewSocket:OnSend(intnErrorCode)建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下:在MyServerSocket.h中声明变量public::CNewSocket*m_pSocket;voidCMyServerSocket:OnAccept(intnErrorCode)CNewSocket*pSocket=newC
13、NewSocket();if(Accept(*pSocket)pSocket-AsyncSelect(FD_READ);m_pSocket=pSocket;elsedeletepSocket;为对话框添加一个侦听”按钮,添加如下代码:在CsockServerDlg.ccp中声明变量public:CMyServerSocketm_srvrSocket;voidCCSockServerDlg:OnListen()SOCK_STREAM , FD_ACCEPT);if(m_srvrSocket.m_hSocket=INVALID_SOCKETBOOLbFlag=m_srvrSocket.Create(UserPortif(!bFlag)AfxMessageBox(SocketError!”);M_srvrSocket.Close();PostQuitMessage(0);Return;if(!m_srvrSocket。Listen(1)intnErrorCode=m_srvrSocket.GetLastErrorif(nError!=WSAEWOULDBLOCK)AfxMessageBox(SocketError!”);M_srvrSocket.Close();P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年国家知识产权局专利局专利审查协作河南中心专利审查员招聘考试真题
- 黑龙江大学《综合英语》2025 学年第二学期期末试卷
- 安卓课程设计简单题目
- 2025年上海大学上海市科创教育研究院招聘行政专员备考题库参考答案详解
- 2025 九年级语文下册议论文论据选择标准课件
- 2025 九年级语文下册新闻阅读与写作指导课件
- 2025年南昌农商银行中层管理岗位人员招聘5人备考题库及完整答案详解一套
- 2025广东江门恩平市公安局警务辅助人员招聘41人(第二批)备考核心试题附答案解析
- 2025广州东站江门市江海区银信资产管理有限公司招聘1人参考考试题库及答案解析
- c语言课程设计年龄
- 2025贵州锦麟化工有限责任公司第三次招聘7人备考笔试题库及答案解析
- 2025广东广州琶洲街道招聘雇员(协管员)5人笔试考试参考试题及答案解析
- 2025国家统计局齐齐哈尔调查队招聘公益性岗位5人笔试考试备考试题及答案解析
- 雨课堂学堂在线学堂云《劳动教育(西安理大 )》单元测试考核答案
- 2025年特种作业人员危险化学品安全作业(化工自动化控制仪表)考试题库及答案
- 人社局公益性岗位笔试题目及答案
- 2025年华住集团酒店考试题库
- 《建设工程施工合同示范文本》(GF-2022-0201) 核心条款与使用指南
- 2025年超星尔雅学习通《数据分析与统计》考试备考题库及答案解析
- 2025纪检监察应知应会试题库与参考答案
- 2025年高考浙江卷(6月)物理真题(解析版)
评论
0/150
提交评论