版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔护理的跨学科合作
- 13第十三章 甲状腺疾病病人的护理
- 2026冠心病CT检查和诊断中国专家共识
- 2026关注自己和同学的情绪
- 社区护理学(成教专升本)第2章 流行病学在社区护理中的应用
- 护理文书书写规范
- 安徽中考·九年级语文 行文思路梳理与探究复习教案
- 初中八年级地理上册《工业-国民经济的主导产业》第一课时导学案
- 初中八年级历史:《北伐战争》教案
- 中医护理气功调养方法
- 机械公司新员工三级安全培训
- 重症双瓣置换术护理查房
- (2026年)癫痫所致精神障碍患者的护理查房课件
- 苏州卫生职业技术学院《基础护理学一》2024-2025学年第一学期期末试卷
- 《人源细胞库建设与管理评估》(征求意见稿)
- 2025新《食品安全法》解读及案例分析讲座课件
- 江西省上饶市信州区2024-2025学年八年级下学期期末考试道德与法治试卷
- 合伙开陪玩工作室协议书
- Android低功耗与AI融合开发-洞察及研究
- 2024-2025学年统编版七年级语文下学期期末必刷常考题之字音字形
- 2025北京海淀八年级(下)期末英语试卷
评论
0/150
提交评论