VC++的网络编程总结.doc
《VC++的网络编程总结.doc》由会员分享,可在线阅读,更多相关《VC++的网络编程总结.doc(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、使用VC+的网络编程总结1套接字编程原理1.1 Client/server通信模型1.2 Windows Sockets规范1.3 套接字1.3.1 套接字定义1.3.2分类1.3.3 套接字的作用1.3.4端口与地址1.3.5 套接口属性2基本的Windows Sockets API编程2.1常用函数2.2 TCP实例2.3 UDP实例2.4 Socket 通信阻塞的解决方法3MFC下的Socket编程的类3.1 CAsyncSocket类3.2 CSocket类3.3 Windows Sockets:带存档的套接字的工作方式3.4 流式套接字通信的操作顺序3.5 使用 CAsyncSock
2、et 类3.6 从套接字类派生3.7 套接字通知3.8 一个使用CSocket类的网络通信实例3.8.1 服务器端应用程序设计(ServerDemo)3.8.2 客户端应用程序设计(项目名称ClientDemo)4套接字的托管实现4.1 System:Net:Sockets 命名空间4.2 实例:一个新邮件检查器1套接字编程原理一个完整的网间通信进程需要由两个进程组成,并且只能用同一种高层协议。也就是说,不可能通信的一端用TCP,而另一端用UDP。一个完整的网络信需要一个五元组来标识:协议、本地地址、本地端口号、远端地址、远端端口号。1.1 Client/server通信模型在客户/服务器模式
3、中我们将请求服务的一方称为客户(client),将提供某种服务的一方称为服务器(server)。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务对客户的请求作出适当的反应。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过无连接的接口提供的。客户机/服务器的请求/响应过程示意图如下所示。图1 客户/服务器通信模型通过上面的分析,我们不难理解一个一个完整的网络应用程序包括客户端和服务器两个部分。客户与服务器进程的作用是非对称的,因此编码不
4、同。服务进程一般是等待客户请求而启动的,只要系统运行,该服务进程一直存在,直到终止或强迫终止。1.2 Windows Sockets规范Windows Sockets 规范是90年代初Microsoft公司联合其他几家大公司共同制定的一套在Windows下的二进制兼容网络编程接口规范。它以U.C.Berkeley大学BSD UNIX中流行的Socket接口为基础,主要在其上扩充了一组针对Windows的扩展库函数,增加了符合Windows消息驱动特性的网络事件异步选择机制,以使程序员能够充分利用Windows消息驱动机制进行编程。Windows Sockets 的用途是将基础网络抽象出来,这样
5、,您不必对网络非常了解,并且您的应用程序可在任何支持套接字的网络上运行。它为应用程序开发者定义了一套简单统一的API,并让各家网络软件供应商共同遵守。Windows Sockets规范从90年代初的1.0版本开始,经过不断的完善和发展,目前已经有了Windows Sockets 2版本。值得注意的是,Microsoft的MFC库现在只支持Windows Sockets 1版本,不支持Windows Sockets 2版本。MFC提供了两个类用以封装Windows Sockets API。一个是CAsyncSocket类,它主要是提供给那些具有一定网络编程经验,希望同时拥有Socket API编
6、程的灵活性和类库编程便利性的开发者的。另一个是CSocket类,它由CAsyncSocket类派生,它具有更高的抽象化,致力于简化网络编程所需的操作。1.3 套接字1.3.1 套接字定义套接字是一个通信终结点,它是Sockets 应用程序用来在网络上发送或接收数据包的对象。套接字具有类型,与正在运行的进程相关联,并且可以有名称。目前,套接字一般只与使用网际协议组的同一“通信域”中的其他套接字交换数据。使用套接字的应用程序间通信模型如图2所示。1.3.2分类可用的套接字类型有以下两种: 1.3.2.1流式套接字 (stream)流式套接字提供没有记录边界的数据流,即字节流。字节流能确保以正确的顺
7、序无重复地被送达。 1.3.2.2 数据报套接字 (UDP)数据报套接字支持面向记录的数据流,但不能确保能被送达,也无法确保按照发送顺序或不重复。 “有序”指数据包按发送的顺序送达。“不重复”指一个特定的数据包只能获取一次。这两种套接字都是双向的,是可以同时在两个方向上(全双工)进行通信的数据流。注意在某些网络协议下(如 XNS),流可以面向记录,即作为记录流而非字节流。但在更常用的 TCP/IP 协议下,流为字节流。Windows Sockets 提供与基础协议无关的抽象化级别。1.3.3 套接字的作用套接字的作用非常大,至少在下面三种通信上下文中如此: l 客户端/服务器模型。 l 对等网
8、络方案,如聊天应用程序。 l 通过让接收应用程序将消息解释为函数调用来进行远程过程调用 (RPC)。 Remote Procedures Call1.3.4端口与地址在网络上,一个套接字的标识主要借助于地址和端口来描述。套接字的地址指该套接字所在计算机的网络地址,可以为域名或IP地址的形式。通常,创建套接字时不必指明网络地址,只有在拥有多个网络地址的机器时,才需要显式指定一个网络地址。同一机器上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进行网络通信,此时如果只有地址标识套接字,则当一个通信包到达机器时,将无法确定究竟是哪个应用程序的套接字需要接收此信息。由此增加了端口的概念,以
9、协助区分同一机器上不同应用程序的套接字。端口用于标识进程,同一机器上不同的网络应用程序各有不同的端口,这样,通过“网络地址+端口号”的标识方法,便唯一标识了机器上的应用程序了。某些端口是专门为公共服务保留的(Ftp:21,http:80),除非程序是要提供这些服务,否则应尽量避免使用这些端口。一般来说,端口1024以前的端口号都是系统保留的或是作为公共服务的,应尽量选择大于1024的端口号,以避免冲突。1.3.5 套接口属性套接口有一系列的属性用于标识套接口的状态等信息,它们的属性如表1所示。表1 套接口属性选项类型含义缺省值SO_ACCEPTCONBOOL套接口正在监听FALSESO_BRO
10、ADCASTBOOL套接口设置为可发送广播数据FALSESO_DEBUGBOOL允许DebugFALSESO_DONTLINGERBOOL是否禁止SO_LINGER选项TRUESO_DONTROUTEBOOL路由被禁止FALSESO_ERRORint得到并且清除错误状态0SO_KEEPALIVEBOOL活跃信息正在被发送FALSESO_LINGERstruct返回目前的linger信息1_onoffSO_OOBINLINEBOOL带外数据正在普通数据流中被接收FALSESO_RCVBUFint接收缓冲区大小与具体实现有关SO_REUSEADDRBOOL该套接口捆绑的地址可否被他人使用FALSE
11、SO_SNDBUFint发送缓冲区大小与具体实现有关SO_TYPEint套接口类型与接口类型有关TCP_NODELAYBOOL禁止采用Nagle进行合并传送与具体实现有关可以通过getsockopt()函数获取套接口的属性,也可以通过setsockopt()函数设置套接口的属性。2. 基本的Windows Sockets API编程l 需要在程序中添加下面的包含语句:#includel 使用vc+编译时需添加编译链接依赖项ws2_32.lib库l 协议寻址 在winsock中,应用程序通过sockaddr_in 结构来指定IP地址和服务端口信息sockaddr_in internetAddr;
12、int nPortID=5320;internetAddr.sin_family=AF_INET;internet.sin_addr.s_addr=inet_addr(“202.202.42.88”); /INADDR_ANY internet.sin_port=htons(nPortID);ip地址不容易记忆,还提供了许多地址和名称解析函数如gethostbyname,gethostbyaddr等。2.1常用函数1)WSAStartup 调用windows Socket DLL函数原型 int WSAStartup( WORD wVersionRequested, /应用程序要求的socke
13、ts版本 LPWSADATA lpWSAData /指向数据结构WSDATA的指针, /得到windows Socket的具体信息);WSDATA定义如下:typedef struct WSAData WORD wVersion; WORD wHighVersion;#ifdef _WIN64 unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_
14、LEN+1;#else char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo;#endif WSADATA, FAR * LPWSADATA;2)WSACleanup 结束对Windows Sockets DLL的调用函数原型:int WSACleanup(void);3)socket 用于建立Sockets。函数原型:SOCKET s
15、ocket( int af, /地址族,一般是AF_INET int type , /socket类型,SOCK_STREAM或SOCK_DGRAM int protocol /协议类型,通常取值 0); 4)closesocket 关闭套接字函数原型:int closesocket(SOCKET s /要关闭的套接字); 5)bind 将一个本地地址和一个SOCKET描述字连接起来函数原型:int bind( SOCKET s, /要绑定的套接字 const struct sockaddr FAR* name, /指向SOCKADDR结构的地址 int namelen /地址结构的sizeo
16、f )Tcp/ip SOCKADDR结构struct sockaddr unsigned short sa_family;char sa_data4;struct sockaddr_in short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero8;6)listen 设定socket 为监听状态函数原型:int listen( SOCKET s, /进行监听的socket int backlog /客户端可以连接的请求个数 );7)accept 接受一个socket的连接请求,同时返回一个新
17、的socket,新的socket用来在服务器与客户端之间传递和接收信息。函数原型:SOCKET accept( SOCKET s, /处于监听状态的socket struct sockaddr FAR* addr, /将要接受地址的sockaddr指针 int FAR* addrlen /地址的长度 );8)connect 连接客户端的socket到指定的网络服务器。连接成功后,客户端用此socket与服务器通信。函数原型:int connect( SOCKET s, /将要连接的socket const struct sockaddr FAR* name, /目标socket地址 int n
18、amelen /地址结构sizeof );9)recv用于接收已经建立连接的socket数据信息函数原型:int recv( SOCKET s, char FAR* buf, /接收数据缓冲区 int len ,/缓冲区长度 int flags /有MSG_PEEK和 MSG_OOB );返回值:接收到的字节数10)send 对已经建立连接的socket发送数据信息函数原型:int send( SOCKET s, char FAR* buf, /发送数据缓冲区 int len ,/缓冲区长度 int flags /有MSG_PEEK和 MSG_OOB );返回值:发送的字节数11)WSAAsy
19、ncSelect要求socket在有事件发生时通知使用者,本函数将套接口设置成为非阻塞方式。函数原型:int WSAAsyncSelect( SOCKET s, HWND hWnd, /接收网络事件的窗口句柄 unsigned int wMsg,/发送给窗口的网络事件消息 long lEvent /网络消息 );12)sendto 向目标地址发送数据信息int sendto( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen);13)recvfrom 接收目
20、标地址传来的数据信息int recvfrom( IN SOCKET s, OUT char FAR * buf, IN int len, IN int flags, OUT struct sockaddr FAR * from, IN OUT int FAR * fromlen );2.2 TCP实例服务器端需要建立两个套接字,一个用于监听连接请求,另一个用来与请求连接的套接字建立连接,实际的数据传送是通过后一个套接字。而客户端只需要一个套接字即可。客户端代码实例(命令行)服务器端代码实例(命令行)#include#includevoid main()SOCKET sock;struct so
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 网络 编程 总结
限制150内