VC++的网络编程总结

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

使用VC++的网络编程总结1.套接字编程原理1.1Client/server通信模型1.2WindowsSockets规范1.3套接字1.3.1套接字定义1.3.2分类1.3.3套接字的作用1.3.4端口与地址1.3.5套接口属性2.基本的WindowsSocketsAPI编程2.1常用函数2.2TCP实例2.3UDP实例2.4Socket通信阻塞的解决方法3.MFC下的Socket编程的类3.1CAsyncSocket类3.2CSocket类3.3WindowsSockets:带存档的套接字的工作方式3.4流式套接字通信的操作顺序3.5使用CAsyncSocket类3.6从套接字类派生3.7套接字通知3.8一个使用CSocket类的网络通信实例3.8.1服务器端应用程序设计(ServerDemo)3.8.2客户端应用程序设计(项目名称ClientDemo)4.套接字的托管实现4.1System::Net::Sockets命名空间4.2实例:一个新邮件检查器1.套接字编程原理一个完整的网间通信进程需要由两个进程组成,并且只能用同一种高层协议。也就是说,不可能通信的一端用TCP,而另一端用UDP。一个完整的网络信需要一个五元组来标识:协议、本地地址、本地端口号、远端地址、远端端口号。1.1Client/server通信模型在客户/服务器模式中我们将请求服务的一方称为客户(client),将提供某种服务的一方称为服务器(server)。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务—对客户的请求作出适当的反应。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过无连接的接口提供的。客户机/服务器的请求/响应过程示意图如下所示。图1客户/服务器通信模型通过上面的分析,我们不难理解一个一个完整的网络应用程序包括客户端和服务器两个部分。客户与服务器进程的作用是非对称的,因此编码不同。服务进程一般是等待客户请求而启动的,只要系统运行,该服务进程一直存在,直到终止或强迫终止。1.2WindowsSockets规范WindowsSockets规范是90年代初Microsoft公司联合其他几家大公司共同制定的一套在Windows下的二进制兼容网络编程接口规范。它以U.C.Berkeley大学BSDUNIX中流行的Socket接口为基础,主要在其上扩充了一组针对Windows的扩展库函数,增加了符合Windows消息驱动特性的网络事件异步选择机制,以使程序员能够充分利用Windows消息驱动机制进行编程。WindowsSockets的用途是将基础网络抽象出来,这样,您不必对网络非常了解,并且您的应用程序可在任何支持套接字的网络上运行。它为应用程序开发者定义了一套简单统一的API,并让各家网络软件供应商共同遵守。WindowsSockets规范从90年代初的1.0版本开始,经过不断的完善和发展,目前已经有了WindowsSockets2版本。值得注意的是,Microsoft的MFC库现在只支持WindowsSockets1版本,不支持WindowsSockets2版本。MFC提供了两个类用以封装WindowsSocketsAPI。一个是CAsyncSocket类,它主要是提供给那些具有一定网络编程经验,希望同时拥有SocketAPI编程的灵活性和类库编程便利性的开发者的。另一个是CSocket类,它由CAsyncSocket类派生,它具有更高的抽象化,致力于简化网络编程所需的操作。1.3套接字1.3.1套接字定义套接字是一个通信终结点,它是Sockets应用程序用来在网络上发送或接收数据包的对象。套接字具有类型,与正在运行的进程相关联,并且可以有名称。目前,套接字一般只与使用网际协议组的同一“通信域”中的其他套接字交换数据。使用套接字的应用程序间通信模型如图2所示。应用程序A套接字A应用程序B套接字B图2套接字通信模型1.3.2分类可用的套接字类型有以下两种:1.3.2.1流式套接字(stream)流式套接字提供没有记录边界的数据流,即字节流。字节流能确保以正确的顺序无重复地被送达。创建并初始化套接字监听来自客户机的请求接受连接请求接收数据发送数据关闭连接创建并初始化套接字请求建立连接发送数据接收数据关闭连接服务器客户机图3流式套接字(有连接通信)编程1.3.2.2数据报套接字(UDP)数据报套接字支持面向记录的数据流,但不能确保能被送达,也无法确保按照发送顺序或不重复。创建并初始化套接字监听来自客户机的请求进行处理发送结果给客户端关闭连接创建并初始化套接字向服务器发出请求接收结果关闭连接服务器客户机图4数据报套接字(无连接通信)编程“有序”指数据包按发送的顺序送达。“不重复”指一个特定的数据包只能获取一次。这两种套接字都是双向的,是可以同时在两个方向上(全双工)进行通信的数据流。注意在某些网络协议下(如XNS),流可以面向记录,即作为记录流而非字节流。但在更常用的TCP/IP协议下,流为字节流。WindowsSockets提供与基础协议无关的抽象化级别。1.3.3套接字的作用套接字的作用非常大,至少在下面三种通信上下文中如此:客户端/服务器模型。对等网络方案,如聊天应用程序。通过让接收应用程序将消息解释为函数调用来进行远程过程调用(RPC)。RemoteProceduresCall1.3.4端口与地址在网络上,一个套接字的标识主要借助于地址和端口来描述。套接字的地址指该套接字所在计算机的网络地址,可以为域名或IP地址的形式。通常,创建套接字时不必指明网络地址,只有在拥有多个网络地址的机器时,才需要显式指定一个网络地址。同一机器上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进行网络通信,此时如果只有地址标识套接字,则当一个通信包到达机器时,将无法确定究竟是哪个应用程序的套接字需要接收此信息。由此增加了端口的概念,以协助区分同一机器上不同应用程序的套接字。端口用于标识进程,同一机器上不同的网络应用程序各有不同的端口,这样,通过“网络地址+端口号”的标识方法,便唯一标识了机器上的应用程序了。某些端口是专门为公共服务保留的(Ftp:21,http:80),除非程序是要提供这些服务,否则应尽量避免使用这些端口。一般来说,端口1024以前的端口号都是系统保留的或是作为公共服务的,应尽量选择大于1024的端口号,以避免冲突。1.3.5套接口属性套接口有一系列的属性用于标识套接口的状态等信息,它们的属性如表1所示。表1套接口属性选项类型含义缺省值SO_ACCEPTCONBOOL套接口正在监听FALSESO_BROADCASTBOOL套接口设置为可发送广播数据FALSESO_DEBUGBOOL允许DebugFALSESO_DONTLINGERBOOL是否禁止SO_LINGER选项TRUESO_DONTROUTEBOOL路由被禁止FALSESO_ERRORint得到并且清除错误状态0SO_KEEPALIVEBOOL活跃信息正在被发送FALSESO_LINGERstruct返回目前的linger信息1_onoffSO_OOBINLINEBOOL带外数据正在普通数据流中被接收FALSESO_RCVBUFint接收缓冲区大小与具体实现有关SO_REUSEADDRBOOL该套接口捆绑的地址可否被他人使用FALSESO_SNDBUFint发送缓冲区大小与具体实现有关SO_TYPEint套接口类型与接口类型有关TCP_NODELAYBOOL禁止采用Nagle进行合并传送与具体实现有关可以通过getsockopt()函数获取套接口的属性,也可以通过setsockopt()函数设置套接口的属性。2.基本的WindowsSocketsAPI编程需要在程序中添加下面的包含语句:#includewinsock2.h使用vc++编译时需添加编译链接依赖项ws2_32.lib库协议寻址在winsock中,应用程序通过sockaddr_in结构来指定IP地址和服务端口信息sockaddr_ininternetAddr;intnPortID=5320;internetAddr.sin_family=AF_INET;internet.sin_addr.s_addr=inet_addr(“202.202.42.88”);//INADDR_ANYinternet.sin_port=htons(nPortID);ip地址不容易记忆,还提供了许多地址和名称解析函数如gethostbyname,gethostbyaddr等。2.1常用函数1)WSAStartup调用windowsSocketDLL函数原型intWSAStartup(WORDwVersionRequested,//应用程序要求的sockets版本LPWSADATAlpWSAData//指向数据结构WSDATA的指针,//得到windowsSocket的具体信息);WSDATA定义如下:typedefstructWSAData{WORDwVersion;WORDwHighVersion;#ifdef_WIN64unsignedshortiMaxSockets;unsignedshortiMaxUdpDg;charFAR*lpVendorInfo;charszDescription[WSADESCRIPTION_LEN+1];charszSystemStatus[WSASYS_STATUS_LEN+1];#elsecharszDescription[WSADESCRIPTION_LEN+1];charszSystemStatus[WSASYS_STATUS_LEN+1];unsignedshortiMaxSockets;unsignedshortiMaxUdpDg;charFAR*lpVendorInfo;#endif}WSADATA,FAR*LPWSADATA;2)WSACleanup结束对WindowsSocketsDLL的调用函数原型:intWSACleanup(void);3)socket用于建立Sockets。函数原型:SOCKETsocket(intaf,//地址族,一般是AF_INETinttype,//socket类型,SOCK_STREAM或SOCK_DGRAMintprotocol//协议类型,通常取值0);4)closesocket关闭套接字函数原型:intclosesocket(SOCKETs//要关闭的套接字);5)bind将一个本地地址和一个SOCKET描述字连接起来函数原型:intbind(SOCKETs,//要绑定的套接字conststructsockaddrFAR*name,//指向SOCKADDR结构的地址intnamelen//地址结构的sizeof)Tcp/ipSOCKADDR结构structsockaddr{unsignedshortsa_family;charsa_data[4];};structsockaddr_in{shortsin_family;unsignedshortsin_port;structin_addrsin_addr;charsin_zero[8];};6)listen设定socket为监听状态函数原型:intlisten(SOCKETs,//进行监听的socketintbacklog//客户端可以连接的请求个数);7)accept接受一个socket的连接请求,同时返回一个新的socket,新的socket用来在服务器与客户端之间传递和接收信息。函数原型:SOCKETaccept(SOCKETs,//处于监听状态的socketstructsockaddrFAR*addr,//将要接受地址的sockaddr指针intFAR*addrlen//地址的长度);8)connect连接客

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功