第6章 网络编程(VC)
《第6章 网络编程(VC)》由会员分享,可在线阅读,更多相关《第6章 网络编程(VC)(63页珍藏版)》请在装配图网上搜索。
1、第6章 网络编程(VC)重庆三峡学院重庆三峡学院数学与计算机科学学院数学与计算机科学学院本章主要内容n1、套接字编程原理、套接字编程原理n2、基本的、基本的Windows Sockets API编程编程n3、MFC下的下的Socket编程的类编程的类 n4、一个使用、一个使用CSocket类的网络通信实例类的网络通信实例 4/15/202421套接字编程原理套接字编程原理n一个完整的网络通信进程需要由两个进一个完整的网络通信进程需要由两个进程组成,并且只能用同一种高层协议。程组成,并且只能用同一种高层协议。n也就是说,不可能通信的一端用也就是说,不可能通信的一端用TCP,而另一端用而另一端用U
2、DP。n一个完整的网络通信需要一个五元组来一个完整的网络通信需要一个五元组来标识:协议、本地地址、本地端口号、标识:协议、本地地址、本地端口号、远端地址、远端端口号。远端地址、远端端口号。4/15/202431.1 Client/server通信模型通信模型 n在客户在客户/服务器模式中我们将请求服务的服务器模式中我们将请求服务的一方称为客户端(一方称为客户端(client),将提供某种),将提供某种服务的一方称为服务器(服务的一方称为服务器(server)。)。n一个服务程序通常在一个众所周知的地一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说服务进址监听对服务的请求,也就是说
3、服务进程一直处于休眠状态,直到一个客户端程一直处于休眠状态,直到一个客户端对这个服务的地址提出了连接请求。对这个服务的地址提出了连接请求。4/15/20244n在这个时刻,服务程序被在这个时刻,服务程序被“惊醒惊醒”并且并且为客户端提供服务为客户端提供服务对客户端的请求作对客户端的请求作出适当的反应。出适当的反应。n虽然基于连接的服务是设计客户端虽然基于连接的服务是设计客户端/服务服务器应用程序的标准,但有些服务也是可器应用程序的标准,但有些服务也是可以通过无连接的接口提供的。以通过无连接的接口提供的。4/15/20245客户端/服务器的请求/响应过程示意图如下所示。图1 客户/服务器通信模型
4、 4/15/20246n通过上面的分析,我们不难理解一个一通过上面的分析,我们不难理解一个一个完整的网络应用程序包括客户端和服个完整的网络应用程序包括客户端和服务器两个部分。务器两个部分。n客户端与服务器进程的作用是非对称的,客户端与服务器进程的作用是非对称的,因此编码不同。因此编码不同。n服务进程一般是等待客户端请求而启动服务进程一般是等待客户端请求而启动的,只要系统运行,该服务进程一直存的,只要系统运行,该服务进程一直存在,直到终止或强迫终止。在,直到终止或强迫终止。4/15/202471.2 Windows Sockets规范 nWindows Sockets 规范是规范是90年代初年代
5、初Microsoft公公司联合其他几家大公司共同制定的一套在司联合其他几家大公司共同制定的一套在Windows下的二进制兼容网络编程接口规范。下的二进制兼容网络编程接口规范。n它以它以U.C.Berkeley大学大学BSD UNIX中流行的中流行的Socket接口为基础,主要在其上扩充了一组针接口为基础,主要在其上扩充了一组针对对Windows的扩展库函数,增加了符合的扩展库函数,增加了符合Windows消息驱动特性的网络事件异步选择机消息驱动特性的网络事件异步选择机制,以使程序员能够充分利用制,以使程序员能够充分利用Windows消息驱消息驱动机制进行编程。动机制进行编程。4/15/2024
6、8nWindows Sockets 的用途是将基础网络抽的用途是将基础网络抽象出来,这样,您不必对网络非常了解,象出来,这样,您不必对网络非常了解,并且您的应用程序可在任何支持套接字并且您的应用程序可在任何支持套接字的网络上运行。的网络上运行。n它为应用程序开发者定义了一套简单统它为应用程序开发者定义了一套简单统一的一的API,并让各家网络软件供应商共同,并让各家网络软件供应商共同遵守。遵守。4/15/20249nMFC提供了两个类用以封装提供了两个类用以封装Windows Sockets API。n一个是一个是CAsyncSocket类,它主要是提供给那些类,它主要是提供给那些具有一定网络编
7、程经验,希望同时拥有具有一定网络编程经验,希望同时拥有Socket API编程的灵活性和类库编程便利性的开发者。编程的灵活性和类库编程便利性的开发者。n另一个是另一个是CSocket类,它由类,它由CAsyncSocket类派类派生,它具有更高的抽象化,致力于简化网络编生,它具有更高的抽象化,致力于简化网络编程所需的操作。程所需的操作。4/15/2024101.3 套接字套接字(Socket)1.3.1 套接字定义套接字定义 n套接字,是支持套接字,是支持TCP/IP的网络通信的基的网络通信的基本操作单元,可以看做是不同主机之间的本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点。进
8、程进行双向通信的端面点。n简单的说,套接字就是通信两方的一种约简单的说,套接字就是通信两方的一种约定,用套接字中的相关函数来完成通信过定,用套接字中的相关函数来完成通信过程。程。4/15/202411使用套接字的应用程序间通信模型如图2所示。4/15/2024121.3.2分类分类n可用的套接字类型有以下两种:可用的套接字类型有以下两种:n流式套接字流式套接字 n数据报套接字数据报套接字 4/15/2024131.3.2.1 流式套接字流式套接字 n流式套接字提供没有记录边界的数据流,流式套接字提供没有记录边界的数据流,即字节流。字节流能确保以正确的顺序即字节流。字节流能确保以正确的顺序无重复
9、地被送达。无重复地被送达。4/15/2024144/15/2024151.3.2.2 数据报套接字数据报套接字 n数据报套接字支持面向记录的数据流,数据报套接字支持面向记录的数据流,但不能确保能被送达,也无法确保按照但不能确保能被送达,也无法确保按照发送顺序或不重复。发送顺序或不重复。4/15/2024164/15/2024171.3.3 套接字的作用套接字的作用 n套接字的作用非常大,至少在下面三种套接字的作用非常大,至少在下面三种通信上下文中如此:通信上下文中如此:n客户端客户端/服务器模型。服务器模型。n对等网络方案,如聊天应用程序。对等网络方案,如聊天应用程序。n通过让接收应用程序将消
10、息解释为函数调用通过让接收应用程序将消息解释为函数调用来进行远程过程调用来进行远程过程调用(RPC)。4/15/2024181.3.4端口与地址端口与地址 n在网络上,一个套接字的标识主要借助在网络上,一个套接字的标识主要借助于地址和端口来描述。于地址和端口来描述。n套接字的地址指该套接字所在计算机的套接字的地址指该套接字所在计算机的网络地址,可以为域名或网络地址,可以为域名或IP地址的形式。地址的形式。n通常,创建套接字时不必指明网络地址,通常,创建套接字时不必指明网络地址,只有在拥有多个网络地址的机器时,才只有在拥有多个网络地址的机器时,才需要显式指定一个网络地址。需要显式指定一个网络地址
11、。4/15/202419n同一机器上可以运行多个网络应用程序,同一机器上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进每个应用程序都有自己的套接字用以进行网络通信,此时如果只有地址标识套行网络通信,此时如果只有地址标识套接字,则当一个通信包到达机器时,将接字,则当一个通信包到达机器时,将无法确定究竟是哪个应用程序的套接字无法确定究竟是哪个应用程序的套接字需要接收此信息。需要接收此信息。n由此增加了端口的概念,以协助区分同由此增加了端口的概念,以协助区分同一机器上不同应用程序的套接字。一机器上不同应用程序的套接字。4/15/202420n端口用于标识进程,同一机器上不同的网络应端口
12、用于标识进程,同一机器上不同的网络应用程序各有不同的端口,这样,通过用程序各有不同的端口,这样,通过“网络地网络地址址+端口号端口号”的标识方法,便唯一标识了机器的标识方法,便唯一标识了机器上的应用程序了。上的应用程序了。n某些端口是专门为公共服务保留的某些端口是专门为公共服务保留的(ftp:21,http:80),除非程序是要提供这些服),除非程序是要提供这些服务,否则应尽量避免使用这些端口。务,否则应尽量避免使用这些端口。n一般来说,端口一般来说,端口1024以前的端口号都是系统保以前的端口号都是系统保留的或是作为公共服务的,应尽量选择大于留的或是作为公共服务的,应尽量选择大于1024的端
13、口号,以避免冲突。的端口号,以避免冲突。4/15/2024212、基本的基本的Windows Sockets API编程编程 n需要在程序中添加下面的包含语句:需要在程序中添加下面的包含语句:#includen使用使用VC+编译时需添加编译链接依赖项编译时需添加编译链接依赖项ws2_32.lib库库n协议寻址协议寻址4/15/2024223、MFC下的下的Socket编程的类编程的类nMFC提供了两个类来支持套接字编程,提供了两个类来支持套接字编程,它们是它们是CAsyncSocket类和类和CSocket类。类。4/15/2024233.1 CAsyncSocket类类 nCAsyncSoc
14、ket类一对一地封装类一对一地封装Windows Socket API。nCAsyncSocket类适合那些对网络通信细节很了类适合那些对网络通信细节很了解,且希望利用回调的便利通知网络事件的程解,且希望利用回调的便利通知网络事件的程序员使用。序员使用。n如果想利用如果想利用Windows Sockets方便地处理方便地处理MFC应用程序中的多个网络协议,而又不想放弃灵应用程序中的多个网络协议,而又不想放弃灵活性,可以考虑使用活性,可以考虑使用CAsyncSocket。4/15/202424nCAsyncSocket类是类是MFC在方便性与灵活在方便性与灵活性中的一种折衷方案。性中的一种折衷方
15、案。nMFC提供了一个类用以保留网络编程的提供了一个类用以保留网络编程的灵活性,而方便性则由下面要讲到的灵活性,而方便性则由下面要讲到的CSocket类来提供。类来提供。4/15/2024253.2 CSocket类类nCSocket类是类是CAsyncSocket类的派生类,类的派生类,它致力于提供比它致力于提供比CAsyncSocket类更高的类更高的抽象性,使得网络编程变得简单方便。抽象性,使得网络编程变得简单方便。nCSocket类支持流方式和数据报方式,但类支持流方式和数据报方式,但一般情况下用的更多的是流方式的数据一般情况下用的更多的是流方式的数据通信。通信。4/15/202426
16、n在流方式的通信模式下,在流方式的通信模式下,CSocket类通常会与类通常会与CArchive类结合,以串行化的方式发送和接收类结合,以串行化的方式发送和接收数据,这使得网络编程变得像读写文件一样简数据,这使得网络编程变得像读写文件一样简单了。单了。nCArchive类扮演的是一个数据缓冲区的角色,类扮演的是一个数据缓冲区的角色,它通过它通过CSocketFile类与一个套接字相联系。类与一个套接字相联系。n只要建立了两者的联系,然后往只要建立了两者的联系,然后往“数据缓冲区数据缓冲区”装入数据与取出数据就完成了。装入数据与取出数据就完成了。4/15/202427发送数据与接收数据的示意图如
17、图5所示。4/15/202428n由图由图5可以看出只要建立好套接字跟可以看出只要建立好套接字跟CArchive类对象的关联,则发送和接收类对象的关联,则发送和接收数据时,只需要对数据时,只需要对CArchive对象进行操对象进行操作,从而可以利用此类对象优良的串行作,从而可以利用此类对象优良的串行化功能,十分方便地实现发送和接收数化功能,十分方便地实现发送和接收数据。据。4/15/2024294、一个使用、一个使用CSocket类的网类的网络通信实例络通信实例 n本例采用本例采用CSocket编程模型建立一个聊天编程模型建立一个聊天程序的简单实例。程序的简单实例。n建立项目时注意选上建立项目
18、时注意选上“Windows套接字套接字”复选框。复选框。4/15/2024304.1 服务器端应用程序设计服务器端应用程序设计(ServerDemo)1)界面)界面 4/15/202431控件控件类型型控件控件IDCaption属性属性控件控件变量量变量量类型型列表框IDC_Log无m_LogCtrlCListBox编辑框IDC_Message无m_MsgCtrlCEdit按钮IDC_Send发送M_SendCtrlCButton静态控件IDC_STATIC记录无无静态控件IDC_STATIC待发消息无无各控件属性如下各控件属性如下 列表框控件列表框控件IDC_Log属性属性“sort”值为值
19、为false,属性属性“Horizontal Scroll”值为值为true。按钮按钮IDC_Send属性属性Disable值为值为true。4/15/2024322)定义CSocket类的派生类CServSocket和CRecvSocket。n从从CSocket编程模型知道,服务器端需要编程模型知道,服务器端需要两种套接字,一个用来侦听连接请求,两种套接字,一个用来侦听连接请求,一个用来与请求连接的套接字建立连接。一个用来与请求连接的套接字建立连接。n因此,为程序添加两个因此,为程序添加两个CSocket派生类:派生类:SServSocket和和CRecvSocket,它们与对,它们与对话框
20、类密切配合,共同完成程序所要求话框类密切配合,共同完成程序所要求实现的功能。实现的功能。4/15/2024333)建立套接字与对话框类的关联 n在程序中,对话框类要用到套接字类,在程序中,对话框类要用到套接字类,而套接字类在响应某些消息,如在函数而套接字类在响应某些消息,如在函数OnAccept、OnReceive中进行处理时,中进行处理时,也要改变对话框的某些控件状态,以反也要改变对话框的某些控件状态,以反映给用户这些事情的发生。映给用户这些事情的发生。4/15/202434n这里存在着两个类相互使用的情况,把套接字这里存在着两个类相互使用的情况,把套接字类对象定义成对话框类的成员变量,同时
21、在套类对象定义成对话框类的成员变量,同时在套接字类中也把对话框类定义为成员变量。接字类中也把对话框类定义为成员变量。n如何实现这样的用法呢?如何实现这样的用法呢?n在对话框类头文件中加入套接字头文件的声明,在对话框类头文件中加入套接字头文件的声明,然后在套接字类头文件中加入对话框类头文件然后在套接字类头文件中加入对话框类头文件的声明,这样的做法显然行不通。的声明,这样的做法显然行不通。4/15/202435具体做法应该如下:n首先,在首先,在ServerDemoDlg.h中加入套接字中加入套接字类头文件的声明,语句类头文件的声明,语句#pragma once的后的后面加入如下语句:面加入如下语
22、句:#include ServSocket.h#include RecvSocket.h 4/15/202436n然后在该文件中为然后在该文件中为CServerDemoDlg类增类增加两个公有成员变量,语句如下:加两个公有成员变量,语句如下:CServSocket*ServSock;CRecvSocket*RecvSock;n这样在对话框类中就可以使用套接字类这样在对话框类中就可以使用套接字类了。了。4/15/202437n继续在套接字类中加入对话框类信息。继续在套接字类中加入对话框类信息。n首先,在首先,在ServSocket.h文件的开头,语句文件的开头,语句#pragma once的后面
23、加入如下语句:的后面加入如下语句:class CServerDemoDlg;4/15/202438n然后,在该文件中为然后,在该文件中为CServSocket类添加类添加一个公有成员变量和一个构造函数:一个公有成员变量和一个构造函数:CServSocket(CServerDemoDlg*Dlg);CServerDemoDlg*m_Dlg;4/15/202439n接着在接着在ServSocket.cpp文件中添加新的构造函文件中添加新的构造函数的实现,并添加一条关于数的实现,并添加一条关于ServerDemoDlg.h文件的预编译声明,代码如下:文件的预编译声明,代码如下:#include“Se
24、rverDemoDlg.h”CServSocket:CServSocket(CServerDemoDlg*Dlg)m_Dlg=Dlg;4/15/202440n这样,在套接字类中也可以通过成员变这样,在套接字类中也可以通过成员变量使用对话框了。量使用对话框了。n使用同样的方法对使用同样的方法对CRecvSocket类进行设类进行设置,使其也可以通过成员变量使用对话置,使其也可以通过成员变量使用对话框。框。4/15/2024414)为套接字添加串行化读写信息的功能。n在服务器端的两个套接字中,只有在服务器端的两个套接字中,只有CRecvSocket套接字是真正与客户端套接套接字是真正与客户端套接字
25、建立连接,发送与接收数据的。字建立连接,发送与接收数据的。n因此,我们只为该类添加串行化读写信因此,我们只为该类添加串行化读写信息功能。息功能。4/15/202442n在在RecvSocket.h文件中为类文件中为类CRecvSocket添加三个公有成员变量。添加三个公有成员变量。CSocketFile*m_File;CArchive*m_ArIn;CArchive*m_ArOut;4/15/2024435)在对话框中初始化套接字并侦听连接请求。n在在OnInitDialog函数中添加如下代码:函数中添加如下代码:/TODO:/TODO:在此添加额外的初始化代码在此添加额外的初始化代码ifif
26、(ServSock(ServSock=newnew CServSocket(CServSocket(thisthis)ifif(ServSock(ServSock-Create(9547)-Create(9547)m_LogCtrl.AddStringm_LogCtrl.AddString(等待连接等待连接.);.);ServSockServSock-Listen();-Listen();elseelse m_LogCtrl.AddStringm_LogCtrl.AddString(初始化失败,请重新启动程序!初始化失败,请重新启动程序!););deletedelete ServSockSer
27、vSock;elseelse m_LogCtrl.AddStringm_LogCtrl.AddString(初始化失败,请重新启动程序!初始化失败,请重新启动程序!););n上述代码主要是创建并初始化上述代码主要是创建并初始化ServSockServSock套接字,并开始侦听连接请求。套接字,并开始侦听连接请求。4/15/2024446)接受连接请求。n由于是由于是CServSocket类的类的ServSock对象在对象在侦听连接请求,因此由该类来接受连接侦听连接请求,因此由该类来接受连接请求。请求。n首先,在首先,在ServSocket.h文件中加入如下语文件中加入如下语句:句:#inclu
28、de“RecvSocket.h”n然后,重载该类的然后,重载该类的OnAccept函数,在该函数,在该函数中添加如下代码:函数中添加如下代码:4/15/202445 CRecvSocketCRecvSocket*tempSocktempSock;ifif(tempSock(tempSock=newnew CRecvSocket(CRecvSocket(thisthis-m_Dlgm_Dlg)ifif(Accept(Accept(*(*tempSocktempSock)tempSocktempSock-m_Filem_File=newnew CSocketFile(tempSockCSocket
29、File(tempSock););tempSocktempSock-m_ArInm_ArIn=newnew CArchive(tempSockCArchive(tempSock-m_Filem_File ,CArchive:loadCArchive:load););tempSocktempSock-m_ArOutm_ArOut=newnew CArchive(tempSockCArchive(tempSock-m_Filem_File ,CArchive:storeCArchive:store););m_Dlgm_Dlg-RecvSockRecvSock=tempSocktempSock;te
30、mpSocktempSock=NULL;=NULL;m_Dlgm_Dlg-m_LogCtrlm_LogCtrl.AddStringAddString(连接成功连接成功,可以开始传递消息可以开始传递消息););m_Dlgm_Dlg-m_SendCtrl.EnableWindowm_SendCtrl.EnableWindow(truetrue););elseelse m_Dlgm_Dlg-m_LogCtrlm_LogCtrl.AddStringAddString(客户端当前的连接尝试失败客户端当前的连接尝试失败););deletedelete tempSocktempSock;elseelse m
31、_Dlgm_Dlg-m_LogCtrlm_LogCtrl.AddStringAddString(连接套接字初始化失败连接套接字初始化失败););4/15/202446n上述代码首先调用上述代码首先调用Accept函数接受连接请求,函数接受连接请求,然后为该连接创建一个然后为该连接创建一个CRecvSocket类型的套类型的套接字,并为该套接字关联接字,并为该套接字关联CArchive对象,使其对象,使其能实现串行化传输信息的功能。能实现串行化传输信息的功能。n最后把关联好的套接字传回给对话框对象供其最后把关联好的套接字传回给对话框对象供其使用。使用。n这样,对话框对象的成员变量这样,对话框对象
32、的成员变量RecvSock套接字套接字便与客户端套接字之间建立了一条信息通道,便与客户端套接字之间建立了一条信息通道,信息将在两个套接字之间传递。信息将在两个套接字之间传递。4/15/2024477)接收信息 n连连接接建建立立成成功功后后,当当有有信信息息到到达达服服务务器器端端时时,就就会会引引发发RecvSock套套接接字字对对象象的的OnReceive函函数数,因因此此需需要要重重载载CRecvSocket类的类的OnReceive函数。添加代码如下:函数。添加代码如下:CString str;(*m_ArIn)str;m_Dlg-m_LogCtrl.AddString(对方发来的信息
33、如下对方发来的信息如下:);m_Dlg-m_LogCtrl.AddString(str);m_Dlg-m_LogCtrl.SetCurSel(m_Dlg-m_LogCtrl.GetCount()-1);4/15/2024488)发送信息n为对话框为对话框“发送发送”按钮添加事件处理函数按钮添加事件处理函数OnBnClickedSend(),代码如下:,代码如下:void CServerDemoDlg:OnBnClickedSend()/TODO:在此添加控件通知处理程序代码在此添加控件通知处理程序代码CString str;m_MsgCtrl.GetWindowText(str);if(str
34、.GetLength()=0)AfxMessageBox(空信息空信息,所以不发出所以不发出);elsem_LogCtrl.AddString(你发出的信息如下你发出的信息如下:);m_LogCtrl.AddString(str);m_LogCtrl.SetCurSel(m_LogCtrl.GetCount()-1);*(RecvSock-m_ArOut)m_ArOut-Flush();4/15/2024494.2 客户端应用程序设计客户端应用程序设计(项目项目名称名称ClientDemo)1)界面)界面 4/15/202450控件控件类型型控件控件IDCaption属性属性控件控件变量量变量
35、量类型型列表框IDC_Log无m_LogCtrlCListBox编辑框IDC_Message无m_MsgCtrlCEdit按钮IDC_Send发送m_SendCtrlCButton静态控件IDC_STATIC记录无无静态控件IDC_STATIC待发消息无无各控件属性如下各控件属性如下 列表框控件列表框控件IDC_Log属性属性“sort”值为值为false,属性属性“Horizontal Scroll”值为值为true。按钮按钮IDC_Send属性属性Disable值为值为true。4/15/2024512)创建套接字类(从CSocket类派生)n客户端只需要一个套接字,命名为客户端只需要一个
36、套接字,命名为CClientSocket。4/15/2024523)建立对话框类与套接字类的关联。n首先,在首先,在ClientDemoDlg.h文件的开头,文件的开头,语句语句#pragma once后面加入如下语句:后面加入如下语句:#include“ClientSocket.h”4/15/202453n然后,在该文件中为然后,在该文件中为CClientDemoDlg类类添加一个公有成员变量,语句如下:添加一个公有成员变量,语句如下:CClientSocket*ClientSock;n接着,在接着,在ClientSocket.h文件的开头,语文件的开头,语句句#pragma once后面加
37、入如下语句:后面加入如下语句:class CClientDemoDlg;4/15/202454n然后,在该文件中为然后,在该文件中为CClientSocket类添类添加一公有成员变量和一个构造函数,语加一公有成员变量和一个构造函数,语句如下:句如下:CClientSocket(CClientDemoDlg*Dlg);CClientDemoDlg*m_Dlg;4/15/202455n接着,在接着,在ClientSocket.cpp文件中添加新的构造函数的文件中添加新的构造函数的实现代码,并添加一条关于实现代码,并添加一条关于CClientDemoDlg.h文件的文件的预编译声明,代码如下:预编译
38、声明,代码如下:#include ClientDemoDlg.hCClientSocket:CClientSocket(CClientDemoDlg*Dlg)m_Dlg=Dlg;n这样,便完成了对话框和套接字之间的连接了。这样,便完成了对话框和套接字之间的连接了。4/15/2024564)为套接字添加串行化读写信息的功能n在在ClientSocket.h文件中,为类文件中,为类CClientSocket添加三个公有成员变量,添加三个公有成员变量,代码如下:代码如下:CSocketFile*m_File;CArchive*m_ArIn;CArchive*m_ArOut;4/15/2024575)
39、在对话框中初始化套接字并建立连接 n在对话框类的在对话框类的OnInitDialog函数中添加如函数中添加如下代码下代码 4/15/202458/TODO:在此添加额外的初始化代码在此添加额外的初始化代码m_LogCtrl.AddString(正在连接正在连接.);if(ClientSock=new CClientSocket(this)if(ClientSock-Create()if(ClientSock-Connect(localhost,9547)ClientSock-m_File=new CSocketFile(ClientSock);ClientSock-m_ArIn=new CAr
40、chive(ClientSock-m_File,CArchive:load);ClientSock-m_ArOut=new CArchive(ClientSock-m_File,CArchive:store);m_LogCtrl.AddString(连接成功连接成功,可以开始传递消息可以开始传递消息);m_SendCtrl.EnableWindow(true);elsem_LogCtrl.AddString(连接不成功连接不成功);delete ClientSock;elsem_LogCtrl.AddString(初始化失败初始化失败,请重新启动程序请重新启动程序);delete Client
41、Sock;elsem_LogCtrl.AddString(初始化失败初始化失败,请重新启动程序请重新启动程序);4/15/2024596)接收消息 n消息到来时,会引发套接字的消息到来时,会引发套接字的OnReceive消息,因此要重载消息,因此要重载CClientSocket类的类的OnReceive函数,在其中添加代码如下函数,在其中添加代码如下 4/15/202460/TODO:在此添加专用代码和在此添加专用代码和/或调用基类或调用基类 CString str;m_Dlg-m_LogCtrl.AddString(对方发来对方发来消息如下消息如下:);*m_ArInstr;m_Dlg-m_
42、LogCtrl.AddString(str);m_Dlg-m_LogCtrl.SetCurSel(m_Dlg-m_LogCtrl.GetCount()-1);4/15/2024617)发送信息为对话框为对话框“发送发送”按钮添加事件处理函数按钮添加事件处理函数OnBnClickedSend(),代码如下:,代码如下:void CClientDemoDlg:OnBnClickedSend()/TODO:在此添加控件通知处理程序代码在此添加控件通知处理程序代码CString str;m_MsgCtrl.GetWindowText(str);if(str.GetLength()=0)AfxMessageBox(空信息空信息,所以不发出所以不发出);elsem_LogCtrl.AddString(你发的信息如下你发的信息如下:);m_LogCtrl.AddString(str);m_LogCtrl.SetCurSel(m_LogCtrl.GetCount()-1);*(ClientSock-m_ArOut)m_ArOut-Flush();4/15/2024624.3 应用程序的执行应用程序的执行 n先执行服务器程序,然后运行客户端程先执行服务器程序,然后运行客户端程序。序。4/15/202463
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。