利用CAsyncSocket类实现Socket编程_第1页
利用CAsyncSocket类实现Socket编程_第2页
利用CAsyncSocket类实现Socket编程_第3页
利用CAsyncSocket类实现Socket编程_第4页
利用CAsyncSocket类实现Socket编程_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论