版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年云浮市新兴县“百万英才汇南粤”招聘教育人才40人备考题库及答案详解(新)
- 2025年博罗县惠博小学音乐教师招聘备考题库及参考答案详解一套
- 高中化学与生物课程结合人工智能的创新设计研究教学研究课题报告
- 紫封小学2025年公开招聘临时顶岗教师备考题库附答案详解
- 金华市丽泽中学2026年编外教师招聘备考题库及参考答案详解1套
- 中班月份教学计划
- 中班语言我长大了教案
- 2025年华中农业大学动物科学技术学院、动物医学院P3实验室专业技术辅助岗位招聘备考题库附答案详解
- 2025年招聘丨重庆农投肉食品有限公司招聘备考题库附答案详解
- 2025年中国铁路广州局集团有限公司招聘普通高校毕业生60人备考题库(三)及参考答案详解一套
- 地理 八年级 第二学期 商务版 北方地区 单元作业设计
- DB14T2163-2020 《信息化项目软件运维费用测算指南》
- 2025年中国氯丁橡胶项目投资计划书
- 《金融大模型应用评测指南》
- 基于MOFs的α-突触核蛋白寡聚体电化学发光适配体传感器的构建与性能研究
- 护栏投标方案范本
- 酒店突发事件应急预案2025优化版
- 咖啡果小蠹传入风险评估与检疫防控策略探析
- 2024年新高考Ⅰ卷英语真题(原卷+答案)
- 喉运动神经性疾病课件
- 产品碳足迹培训课件
评论
0/150
提交评论