




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个基于UDP的网络通迅程序 类别:VC网络类编程 我们知道TCP/IP协议是至今发展最为成功的协议之一,也是整个互联网的基础。它在传输层有两个不同的协议:TCP和UDP,用途都很广泛,下面我就UDP做一个示例程序。整个例子有两个程序组成,一个发送数据,另一个程序接收数据后,完成绘图工作。本文程序运行效果图如下: 一、发送程序首先建立数据发送程序(Fason)。一共发送四个数据:圆心的X坐标、圆心的Y坐标、圆半径R、圆的颜色。它的实现主要如下: void CFasonDlg:OnSend() UpdateData(TRUE);CString m_Getstring;this-m_Cob.GetLBText(m_Cob.GetCurSel(),m_Getstring);if(m_Getstring=_T(Red)yuan1.color=1;if(m_Getstring=_T(Green)yuan1.color=2;if(m_Getstring=_T(Blue)yuan1.color=3;yuan1.x=m_x;yuan1.y=m_y;yuan1.r=m_r;p=&yuan1;CDSocket m_hSocket;m_hSocket.Create(2330,SOCK_DGRAM);m_hSocket.SendTo( p,sizeof(yuan1),3550,);/用结构体发送。 m_x=0; m_y=0; m_r=0; m_hSocket.Close(); UpdateData(FALSE);发送数据时有一个技巧,就是所有数据放在一个结构体中来发送,不用一个一个发送。但是不能在结构体中包含CString等可以变长的数据类型。二、接收程序 下面我们看一下接收数据端的程序(Jieshou)。如下: void CDASocket:OnReceive(int nErrorCode) char buff256;int ret=0;ret=Receive(buff,256);if(ret=ERROR)TRACE(ERROR!);else m_pDoc-Presscessding(buff);class CAsyncSocket:OnReceive(nErrorCode);三、数据处理与显示我们设计程序时,数据通常在文档中处理,显示工作在视图中完成。当整个程序较小时,这感觉不到有何好处,但整个程序较大时,程序的条理就会较清晰,易读性好。所以一定要时时养成良好的设计习惯。数据在文档中处理如下:void CJieshouDoc:Presscessding(char* lbuff)buff=(struct yuan*)lbuff;p.x=buff-x;p.y=buff-y;p.r=buff-r;p.color=buff-color;UpdateAllViews(NULL);在视图中的显示如下: void CJieshouView:OnDraw(CDC* pDC)CJieshouDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);x=pDoc-p.x;y=pDoc-p.y;r=pDoc-p.r;if(pDoc-p.color=1)pDC-SelectObject(new CBrush(RGB(255,0,0);if(pDoc-p.color=2)pDC-SelectObject(new CBrush(RGB(0,255,0);if(pDoc-p.color=3)pDC-SelectObject(new CBrush(RGB(0,0,255); pDC-Ellipse(x-r,y-r,x+r,y+r);利用WinSock进行无连接的通信 类别:VC网络类编程 WinSock提供了对UDP(用户数据报协议)的支持,通过UDP协议我们可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送很简单,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用 int CAsyncSocket:SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )发送数据, int CAsyncSocket:ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 )接收数据。函数调用顺序如图。 利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。下面是相关代码: /* 发送方在端口6800上向接收方端口6801发送数据 */ /发送方代码: BOOL CMy62_s1_clientDlg:OnInitDialog() CDialog:OnInitDialog(); /创建本地套接口 m_sockSend.Create(6800,SOCK_DGRAM,NULL); /绑定本地套接口 m_sockSend.Bind(6800,); /创建一个定时器定时发送 SetTimer(1,3000,NULL); . void CMy62_s1_clientDlg:OnTimer(UINT nIDEvent) static iIndex=0; char szSend20; sprintf(szSend,%010d,iIndex+); /发送UDP数据 int iSend= m_sockSend.SendTo(szSend,10,6801,,0); TRACE(sent %d byten,iSend); . /接收方代码 BOOL CMy62_s1_serverDlg:OnInitDialog() CDialog:OnInitDialog(); /创建本地套接口 m_sockRecv.Create(6801,SOCK_DGRAM,); /绑定本地套接口 m_sockRecv.Bind(6801,); /创建一个定时器定时读取 SetTimer(1,3000,NULL); . void CMy62_s1_serverDlg:OnTimer(UINT nIDEvent) char szRecv20; CString szIP(); UINT uPort=6800; /接收UDP数据 int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); TRACE(received %d byten,iRecv); . /* 接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回 */ 外国人写的ftp服务器代码 类别:VC网络类编程 简介 这篇文章向您介绍了一个功能齐全的ftp服务器代码。它可以同时接受多个ftp连接(多线程)并具有大部分的一些商业ftp服务器的功能。服务器支持所有基本的ftp命令并提供给用户简单的管理接口,支持虚拟目录。 下面是对代码中重点类的描述: CFTPServer CFTPServer类是实际上的ftp服务器,它控制着所有其他的为服务器工作的类。尽管CFTPServer是一个基于对话框的程序,但是它并不依赖于UI,所以也可以用于一个服务程序或console程序。 CFTPEventSink CFTPEventSink类用来“发送”CFTPServer类的事件给主程序,我使用了多继承和虚拟函数。CFTPEventSink类只是一个辅助类,只包括了一些虚拟函数。当你的类继承于CFTPEventSink类时,这些虚拟函数将代表一系列的事件。CFTPServer类需要发送消息通知主程序时,要调用这些函数。 怎样在你的程序中使用CFTPServer类: 1.在工程中加入类的文件。 2.你的主类要继承自CFTPEventSink 3.重载CFTPEventSink类的虚拟函数,这些函数将代表ftp服务器中发出的各个事件。 4.开始服务。 class CMyDlg : public CDialog, CFTPEventSink . CFTPServer m_FTPSERVER; virtual void OnFTPUserConnected(DWORD nThreadID, LPCTSTR lpszUser, LPCSTR lpszAddress); virtual void OnFTPUserDisconnected(DWORD nThreadID, LPCTSTR lpszUser); virtual void OnFTPStatusChange(int nType, LPCTSTR lpszText); virtual void OnFTPReceivedBytesChange(int nBytes); virtual void OnFTPSentBytesChange(int nBytes); virtual void OnFTPStatisticChange(int nType, int nValue); . BOOL CMyDlg:OnInitDialog() CDialog:OnInitDialog(); . / initialize event sink m_FTPSERVER.Initialize(this); / set maximum users to 10 m_FTPSERVER.SetMaxUsers(10); / accept new connections on port 21 m_FTPSERVER.SetPort(21); / activate server m_FTPSERVER.Start(); return TRUE; 明明白白看MFC之程序框架(一) 类别:VC/MFC 对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便。其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用到什么程度,毕竟现在的工具都是非常的强大,对于一般的编程任务来说还没有不能够胜任的工具,否则的话恐怕他就不可能在这个世界上存在哪怕是只有一个月的生命。但是根据个人所好以及周围的人的影响,我们都会去使用某一种或者几种工具。比较Visual Basic 、C+ Builder和Delphi等编程工具,用VC+编写Windows应用程序可以说是最富于挑战性和艰巨性。在本文中我无意去比较各种工具的好坏,仅就我自己学习Visual C+的MFC的体会和心得拿出来与大家一起分享和交流,也希望可以结识更多的志同道合的朋友。就我个人的偏见,学习VC+就应该要学习他的类库MFC(Microsoft Foundation Classes)。也许有的人一听说MFC就有点望而生畏,这是可以理解的,毕竟Microsoft虽然给了我们一个强大而且非常复杂的类库,但是没有给我们带来学习他的好的方便之处。回想自己学习MFC时的无助和迷茫,以及所走过的弯路,现在想起来还心有余悸,虽然我现在也还是处于非常初级的初级入门阶段,但是还是很乐意把自己的心得和体会拿出来一起与大家分享。也希望得到大家的指点。一、SDK应用程序结构我学习MFC之路可是从windows编程开始的(可能这一开始就是弯路了_)。首先也请大家跟着我一起看一个SDK应用程序结构的Windows应用程序。当然也是经典的“Hello world!”了,编写的过程就不必罗嗦了,下面给出他的主要源代码(我使用向导生成的,但是为了阅读的方便经过了一点点的编辑):LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)/ TODO: Place code here.MSG msg;MyRegisterClass(hInstance);if (!InitInstance (hInstance, nCmdShow) return FALSE;/ Main message loop:while (GetMessage(&msg, NULL, 0, 0) if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wParam;BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) return TRUE;/窗口函数WndProc(),回调函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)int wmId, wmEvent;switch (message) case WM_COMMAND: break;case WM_PAINT: hdc = BeginPaint(hWnd, &ps); / TODO: Add any drawing code here. RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; case WM_DESTROY: default: return DefWindowProc(hWnd, message, wParam, lParam); return 0;SDK之Hello World源程序 首先让我们看一下这个程序的结构,WinMain()是函数的入口点,该函数的主要任务是完成一些初始化的工作和维护了一个消息循环。他们的工作流程如下:入口(WinMain())- MyRegisterClass()-InitInstance ()-while消息循环。函数由入口开始执行,之后调用 MyRegisterClass()注册窗口类,之后InitInstance ()生成并显示窗口,这样之后,就完成了一个窗口的初始化工作了(当然,在 MyRegisterClass(),InitInstance ()中都需要调用相应的API函数来具体的实现,不过我这里重点分析的是他的结构,所以不考虑他的具体实现细节),然后就是维护消息循环,至此,这个程序的基本结构就差不多建立了。以后程序的运作就靠个消息循环来推动了。 现在,再让我们看看那个消息循环的结构,在例子程序中,我们是要程序在窗口中输出一句Hello World。在主程序中我们似乎已经把应用程序的框架全部分析的滴水不漏了,但是没有看到要求程序输出Hello World 呀?这就是Windows消息的作用了,我们当然还记得刚刚我们说过主程序还维持了一个消息循环,不错,就是在这个循环里面大有文章。Window应用程序的特点就是消息驱动,当系统或者用户要求应用程序完成某一个任务的时候,所依靠的就是消息,系统会把用户的要求或者系统的要求放到一个消息结构中,然后发送给应用程序,再去处理。我们现在来看看应用程序是怎么来完成我们的任务的。在应用程序初始化完成之后,调用了一个显示窗口的API函数,所以系统知道了程序要显示窗口了,此时(注意,这里就是产生消息的时机),此时就会在消息队列中产生一个WM_PAINT消息,这样,应用程序的消息循环就可以捕捉到这个消息并且将它发送给窗口函数(注意,这个函数是由系统调用的),然后窗口函数就处理这个消息,我们就是在他处理这个消息的时候让他完成我们的任务的。从这个过程中我们可以看到,如果我们要与程序交互的话,需要做得仅仅就是选择适当的时机让系统产生消息了。现在,我们终于可以完全明白SDK的程序的运作过程了。 OK,一个SDK的应用程序的框架就这样被建立了,下面我们再来看看如何建立一个MFC的应用程序的框架,以及这两者之间的对应关系。明明白白看MFC之程序框架(二) 类别:VC/MFC 二MFC应用程序结构在明明白白看MFC之程序框架(一)中我分析了一个经典的应用程序的结构,现在可是要进入主题MFC应用程序结构了应用程序有好多种,为了能够更清楚地与前面的文章形成对比,我们在这里看一个SDI的应用程序,当然例子还是经典的Hello World了。在使用向导生成应用程序后,会发现有好几个文件,首先我们不管有哪些文件,按照程序执行得主线抽取主要的源程序分析一下再说(因为MFC生成的应用程序不是很方便阅读,所以在这里我将他们重新编辑了)。CHelloWorldApp theApp;int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)CWinThread* pThread = AfxGetThread();CWinApp* pApp = AfxGetApp();/ AFX internal initializationif (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow)goto InitFailure;/ App global initializations (rare)if (pApp != NULL & !pApp-InitApplication()goto InitFailure;/ Perform specific initializationsif (!pThread-InitInstance()if (pThread-m_pMainWnd != NULL)TRACE0(Warning: Destroying non-NULL m_pMainWndn);pThread-m_pMainWnd-DestroyWindow();nReturnCode = pThread-ExitInstance();goto InitFailure;nReturnCode = pThread-Run();InitFailure:AfxWinTerm();return nReturnCode;BOOL CWinApp:InitApplication()if (CDocManager:pStaticDocManager != NULL)if (m_pDocManager = NULL)m_pDocManager = CDocManager:pStaticDocManager;CDocManager:pStaticDocManager = NULL;if (m_pDocManager != NULL)m_pDocManager-AddDocTemplate(NULL);elseCDocManager:bStaticInit = FALSE;return TRUE;BOOL CHelloWorldApp:InitInstance()AfxEnableControlContainer();/ Change the registry key under which our settings are stored./ TODO: You should modify this string to be something appropriate/ such as the name of your company or organization.SetRegistryKey(_T(Local AppWizard-Generated Applications);LoadStdProfileSettings(); / Load standard INI file options (including MRU)/ Register the applications document templates. Document templates/ serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CHelloWorldDoc),RUNTIME_CLASS(CMainFrame), / main SDI frame windowRUNTIME_CLASS(CHelloWorldView);AddDocTemplate(pDocTemplate);/ Parse command line for standard shell commands, DDE, file openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);/ Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo)return FALSE;/ The one and only window has been initialized, so show and update it.m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();return TRUE;BOOL CWinApp:InitInstance()return TRUE;MFC应用程序之HelloWorld咋一眼看上去,好像这个程序无从下手分析,甚至连程序的入口点都找不到。其实,上面的程序还是经过整理后才有如此模样。好了,一样的来看看这个程序是怎么运行的吧(要注意的事上面的程序来自于不同的文件,这里排版在一起只是为了更清楚地表示程序的结构,至于MFC的文件组织我会在下面一个话题中具体的分析,这里可以暂时不考虑)。首先,在程序的开始处,首先定义了一个全局变量theApp,我们现在只需要知道他代表了整个程序的存在,然后程序开始介入入口点。有没有搞错,入口点在哪里?不及,其实int AFXAPI AfxWinMain()就是这个程序的入口点,奇怪吧!不过没有关系,就好像我们第一次看到C语言中的main()函数一样,只要了解就可以了。在AfxWinMain()中分别调用了一些类的成员函数,仿照前面的分析方法,也可以画出一个程序执行路径图。入口点-AfxGetThread()-AfxGetApp()-AfxWinInit()-pApp-InitApplication()-pThread-InitInstance()-pThread-Run()。可以看到,程序一样有一个执行的线索可循,但是,相对于SDK来说,如今已经面目全非了,过去的那种清晰的程序结构在这些程序中也有吗?答案是肯定的,只不过他们的具体实现在MFC中都进行了包装而已,那么,还是来看看这个应用程序是如何启动并且运行的吧。程序由AfxWinMain()开始运行后,首先调用了AfxGetApp()来获取应用程序的对象指针pApp,然后通过这个指针调用有关的成员函数来完成初始化和启动工作,最后就调用了Run()函数,在这里,Run()函数就是代表了SDK中的消息循环。事情的发展在预料中进行着,但是似乎还遗漏了一点什么似的?不错,在上面我们的确是还有一样工作没有完成,这就是我们需要的”Hello World”好像还没有输出来!这不是我的疏忽,而是故意的安排,因为MFC中采用了一种全新(当然是相对于SDK来说的了)的消息处理机制,至少在表面上来说是这样的。然而,在这里我不打算一下子就把问题解决掉,毕竟这有点复杂,等我们明白了MFC的文件之间的关系后我会在回答这个问题。我没有想到这篇文章会这么长,刚刚开始的时候我以为我可以一下子就把这个问题说清楚地,但是事实上我写作的思路也像我分析程序时一样,竟然是一个漫长的过程!所以我也有必要提醒一下自己以及读这篇文章的朋友,应该休息一下了。我现在都开始庆幸我把这个问题分成好几个小问题来解决了,我会在接下来的话题中继续讨论的事MFC程序所生成的文件以及它们之间的调用关系. 明明白白看MFC之程序框架(三) 类别:VC/MFC 三程序结构大剖析在前面我分别给出了SDK和MFC应用程序的框架,并且稍微理了一下它们之间的对应关系。但是对于MFC程序来说,要想真正搞懂它的框架的话,还是不够的。现在我要做的事就是继续去分析一下上面的MFC程序,期望能够如我的标题所言,明明白白的看透MFC的应用程序框架。 首先就是看一下应用向导生成的MFC应用程序都有哪些主要的文件,包含哪些类以及相关类的对应功能和他们之间的关系(再次说明,因为我在这里关心的是程序的框架结构,所以对于一些与话题关系不很大的东西我将会略去不提)。在上面的SDI应用程序中,向导为我们生成了4个主要的类,这些类都是MFC类的派生类,分别包含在对应的头文件以及实现文件中。1、 框架窗口类及其相关的文件框架窗口类对应应用程序的主窗口,明白这一点后就可以建立一个对这个类的感性认识了,他的定义是在头文件MainFrm.h中,而实现则是在MainFrm.cpp文件中。所有与框架窗口向光的功能都是在这里定义和实现的。2、 文档类及其相关的文件文档类在应用程序中没有直观的对应关系,但是,我们应该知道的一点就是MFC的框架的一个特点就是文档/视图结构。这里可以抽象一点地来理解,比如说我们在Word中打开了一个文件,其实,这个文件就是文档,而我们看到的只不过是这个文件一个视图,所以说文档提供了应用程序显示的支持,但是我们真正看到的应用程序显示的则是一个视图,文档类的定义是在“Hello WorldDoc.h”中,而他的实现则是在“Hello WorldDoc.cpp”文件中。3、 视图类及其相关的文件视图类是用来显示文档对象的内容的,我们在Word程序中所看到的界面就是一个视图,我们要修改,画图首先操作的对象就是视图,所以,视图类就如他的名称所指出的那样,提供了从用户角度看到的东西。视图类的定义在“Hello WorldView.h”中,实现是在文件“Hello WorldView.h”中。4、 应用程序类及其相关的文件MFC应用程序的初始化,启动运行和结束都是由应用程序对象完成的。他对应的文件是”Hello World.cpp”和”Hello World.h”。 在大致的了解了应用程序对象的作用之后,现在我们来看看它们之间的关系(如下图所示)。 从上面的图中可以大致的看出MFC应用程序对象之间的关系了。应用程序一开始(此处的内容可以参考上一篇)生成应用程序对象,然后,在InitInstance中创建中将会创建文档模板对象(通过CdocManager管理),这样一来,应用程序就可以通过建立的模板对象来管理文档、视图、和框架窗口。至此,我的这篇文章终于可以暂时告一段落了,在文中我主要分析的是应用程序的框架,所以忽略了很多的实现细节。其实,学习MFC是一个非常漫长的路,处在不同的阶段都会产生不同的看法和认识,相信随着学习的深入,每一个人都会有自己的理解。但是在这里我给出的自己的经验就是:在学习MFC的时候,一定要在宏观上对他的应用程序框架有个感性的认识!因为这样之后,我们就会在学习的时候有个明显的方向,知道自己学习的是什么东西。我在一开始的时候,就没有认识到这一点,所以往往在学习过程中,往往会不知道下一步应该做什么,也不明白自己看的东西是做什么用的。希望通过这篇文章可以与大家一起学习! 扔掉Socket实现网络编程 类别:VC/MFC 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。许多文章都曾经介绍过用VC+进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,VC+的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现Socket编程,是非常方便的。客户端创建一个Dialog Based项目:CSockClient。设计一对话框,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。Control ID Type MemberIDC_EDITMSG CEdit m_MSGIDC_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中重载各函数 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*)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_szBuffer);/继续提请一个“读”的网络事件,接收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,Connected 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类添加变量。Control ID Type MemberIDC_Addr CString m_AddrIDC_Port Int m_Port在CSockClientDlg.ccp中添加代码: #include AddrDlg.hprotected:int TryCount;MySock m_clientSocket;UINT m_szPort;public:char m_szServerAdr256; 双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码:m_clientSocket.ShutDown(2);m_clientSocket.m_hSocket=INVALID_SOCKET;m_clientSocket.m_bConnected=FALSE;CAddrDlg m_Dlg; m_Dlg.m_Port=1088;/默认端口1088if (m_Dlg.DoModal()=IDOK & !m_Dlg.m_Addr.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响应函数OnTimer void CCSockClientDlg:OnTimer(UINT nIDEvent) if (m_clientSocket.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) KillTimer(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_clientSocket.m_szBuffer);m_clientSocket.AsyncSelect(FD_WRITE);m_MSG.SetWindowText();双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码:void CCSockClientDlg:OnExit() m_clientSocket.ShutDown(2); /关闭SocketEndDialog(0);运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。 服务端Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。建立一个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_szBuffer,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;elsedelete pSocket;为对话框添加一个“侦听”按钮,添加如下代码:在CsockServerDlg.ccp中声明变量pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《幼儿园教育基础》电子教案-第1单元
- 宏志助航计划就业能力培训体系
- 美团招聘文员培训
- 《托育服务政策法规与职业伦理》课件-第五章
- 《论甲午海战谈》课件
- 独立结算协议书
- 达人经济代理合同协议
- 校园环保协议书
- 车位厂房转让合同协议
- 河坝合同协议书
- 2025网络安全协议合同
- 混凝土考试试题及答案
- 广东2025年广东省生物制品与药物研究所招聘12人笔试历年参考题库附带答案详解
- 2024北京西城区五年级(下)期末英语试题及答案
- 《古埃及文明》课件
- 历届全国初中应用物理知识竞赛汇编
- 国企笔试招聘题目
- 医院培训课件:《西门子Syngo.via工作站的临床应用》
- 企业刑事合规培训课件
- 订做门合同协议范本
- 2025年新版《保障中小企业款项支付条例》解读学习课件
评论
0/150
提交评论