下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC++网络编程

VC++网络编程.doc

VC++网络编程

手机1341987155
2012-08-13 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC++网络编程doc》,可适用于IT/计算机领域

一、WindowsSocketsAPI简介VC对网络编程的支持有socket支持WinInet支持MAPI和ISAPI支持等。其中WindowsSocketsAPI是TCPIP网络环境里也是Internet上进行开发最为通用的API。最早美国加州大学Berkeley分校在UNIX下为TCPIP协议开发了一个API这个API就是著名的BerkeleySocket接口(套接字)。在桌面操作系统进入Windows时代后仍然继承了Socket方法。在TCPIP网络通信环境下Socket数据传输是一种特殊的IO它也相当于一种文件描述符具有一个类似于打开文件的函数调用socket()。可以这样理解:Socket实际上是一个通信端点通过它用户的Socket程序可以通过网络和其他的Socket应用程序通信。Socket存在于一个“通信域”(为描述一般的线程如何通过Socket进行通信而引入的一种抽象概念)里并且与另一个域的Socket交换数据。Socket有三类。第一种是SOCKSTREAM(流式)提供面向连接的可靠的通信服务比如telnet,http。第二种是SOCKDGRAM(数据报)提供无连接不可靠的通信比如UDP。第三种是SOCKRAW(原始)主要用于协议的开发和测试支持通信底层操作比如对IP和ICMP的直接访问。二、WindowsSocket机制分析一些基本的Socket系统调用   主要的系统调用包括:socket()创建Socketbind()将创建的Socket与本地端口绑定connect()与accept()建立Socket连接listen()服务器监听是否有连接请求send()数据的可控缓冲发送recv()可控缓冲接收closesocket()关闭Socket。WindowsSocket的启动与终止  启动函数WSAStartup()建立与WindowsSocketsDLL的连接终止函数WSAClearup()终止使用该DLL这两个函数必须成对使用。异步选择机制  Windows是一个非抢占式的操作系统而不采取UNIX的阻塞机制。当一个通信事件产生时操作系统要根据设置选择是否对该事件加以处理WSAAsyncSelect()函数就是用来选择系统所要处理的相应事件。当Socket收到设定的网络事件中的一个时会给程序窗口一个消息这个消息里会指定产生网络事件的Socket发生的事件类型和错误码。异步数据传输机制  WSAAsyncSelect()设定了Socket上的须响应通信事件后每发生一个这样的事件就会产生一个WMSOCKET消息传给窗口。而在窗口的回调函数中就应该添加相应的数据传输处理代码。三、WinSock基本定义:WinSock是MicrosoftWindowsSocket的简称WinSock为软件开发人员提供一套Windows操作系统上的开放的、支持多种协议的网络编程接口已成为在TCPIP网络编程和Internet应用开发中通用的解决方案。WinSock对一些重要的数据类型和结构做了如下定义。、套接字的定义typedefunsignedintuint    typedefuintSocket、基本数据类型的定义typedefunsignedcharuchartypedefunsignedshortushorttypedefunsignedintuinttypedefunsignedlongulong、网络地址的数据结构网络地址用无符号长整数unsignedlong表示。例如IP地址可以表示为:#defineINADDRLOOPBACKxf用inetaddr()函数可以将分位IP地址转换为unsignedlong类型其定义为:unsignedlonginetaddr(constcharFAR*cp)Cp为点分位IP地址如“”。、套接字地址结构sockaddr结构通用Socket地址结构其定义为:structsockaddr{ushortsafamilycharsadata}其中safamily为网络地址类型随协议的不同而不同一般为AFINET,表示该socket在Internet域中通信。sockaddrin结构专门针对Internet域的Socket地址结构其定义为:structsockaddrin{    shortsinfamily    ushortsinport    structinaddrsinaddr   charsinzero}其中sinfamily必须设定为AFINETsinport为服务器端口如果端口设置为则系统会自动分配一个唯一的端口sinaddr为一个unsignedlong的IP地址若sinaddr为INADDRANY,则表示所有的IP地址sinzero为填充字段用来保证结构的大小、主机地址structhostent{    charFAR*hname               主机名字    charFAR*FAR*haliases    主机别名列表    shorthaddrtype                   地址类型    shorthlength                       地址长度   charFAR*FAR*haddrlist   IP地址   #definehaddrhaddrlist}、常见TCPIP协议的定义#defineIPPROTOIP         #defineIPPROTOICMP   #defineIPPROTOIGMP   #defineIPPROTOTCP     #defineIPPROTOUDP    #defineIPPROTORAW   四、WinSock基本函数:以下介绍几个最基本的WinSock函数用这些函数就可以完成从客户端到服务器端的套接字编程。其基本流程如下图所示:基于(TCPIP面向连接)的socket编程:服务器端程序:创建套接字(socket)。将套接字绑定到一个本地地址和端口上(bind)将套接字设为监听模式准备接受客户请求(listen)等待客户请求到来当请求到来后接受连接请求返回一个新的对应于此次连接的套接字(accept)。用返回的套接字和客户端进行通信(sendrecv)。返回等待另外客户请求。关闭套接字。客户端程序:创建套接字(socket)。向服务器发出连接请求(connect)。和服务器端进行通信(sendrecv)。关闭套接字。基于UDP(面向无连接)的socket编程:服务器端(接收端)程序:创建套接字(socket)。将套接字绑定到一个本地地址和端口上(bind)。等待接受数据(recvfrom)。关闭套接字。客户端(发送端)程序:创建套接字(socket)。向服务器发送数据(sendto)。关闭套接字。、socket()功能:创建一个新的套接字。原形:SocketPASCALFARsocket(intaf,inttype,int     protocol)参数:af通信发生的区域              type要建立的套接字类型             procotol使用的协议类型。、Bind()功能:为一个新创建未绑定的Socket分配端口和local地址。对客户机服务器构架的程序服务器必须使用此函数为Socket分配端口号客户机不用绑定而是由系统自动分配。原形:intPASCALFARBind(Sockets,                    conststructsockaddrFAR*name,intnamelen)参数:s由socket()调用返回的并且未作连接的Socket识   别符。NameWinSock地址结构因协议类型而不同对应TCPIP协议的结构为sockaddrin。namelen表示name的长度。、connect()和accept()功能:用于在客户机服务器构架的程序中建立套接字连接客户端用connect()要求连接某一流式套接字到指定服务器服务器用accept()完成套接字中服务器端Socket,接受客户端的连接请求。原形:intPASCALFARconnect(Sockets,                    conststructsockaddrFAR*name,intnamelen)              SocketPASCALFARaccept(Sockets,                   structsockaddrFAR*addr,intFAR*addrlen)参数:name服务器端Socket将要建立连接的客户端地址namelen表示name的长度。addr要求与服务器端Socket建立连接的客户端地址addrlenaddr的长度。返回值:connect若成功返回否则返回SOCKETERROR                  accept返回的Socket是与客户端通信的Socket。、listen()功能:设定Socket状态为监听监听客户端的请求准备被连接。原形:intPASCALFARlisten(Sockets,intbacklog)参数:backlog未完成连接之前客户端连接请求的最大数。返回值:若成功则返回否则返回SOCKETERROR。、send()与recv()功能:在已建立连接的流式套接字之间收发数据send()发送数据recv()接收数据。原形:intPASCALFARsend(Sockets,                    constcharFAR*buf,intlen,intflags)              intPASCALFARrecv(Sockets,                    constcharFAR*buf,intlen,intflags)参数:s发送或接受数据的套接字。              buf发送或接受数据的缓冲区。              lenbuf的长度              flag函数被调用的方式其值为MSGPEEK                          或MSGOOB、sendto()与recvfrom()功能:若前图建立的不是流式套接字的话就要用sendto()与recvfrom()代替send()与recv()来读写数据。功能与send()与recv()相同。原形:intsendto(Sockets,constcharFAR*buf,intlen,                   intflags,conststructsockaddrFAR*to,inttolen)              intrecvfrom(Sockets,charFAR*buf,intlen,                 intflags,structsockaddrFAR*from,intFAR*fromlen)参数:to指向目标套接字地址的指针(可选)              tolento的长度              from指向保存着返回的源地址的缓冲区的指针                           (可选)              fromlen指向from缓冲区的指针(可选)。返回值:若成功返回发送或接受到的数据长度否则返回                  SOCKETERROR。、closesocket()功能:关闭套接字原形:BOOLPASCALFARclosesocket(Sockets)参数:s要关闭的套接字返回值:若成功则返回否则返回SOCKETERROR。五、WinSock扩展:WinSock对最早的Socket进行了一些扩展主要是增加了符合Windows消息驱动特性的网络事件异步选择机制扩充了一些异步函数。主要异步函数如下:、异步选择函数功能:用来注册应用程序相关的网络事件当事件发生时应用程序窗口函数将接收到一个消息。原形:intPASCALFARWSAAsyncSelect(                     Sockets,                                      HWNDhWnd,            窗口句柄                    UnsignedintwMsg,  需要发送的消息                    LonglEvent)           事件类型    事件类型的值可以是:     FDREAD:当套接字收到数据时接到通知     FDWRITE:当套接字可发送数据时接到通知     FDOOB:当套接字有外来数据到达时接到通知     FDACCEPT:当套接字有外来连接时接到通知FDCONNECT:当套接字连接建立完成时接到通知         FDCLOSE:当套接字关闭时接到通知、异步请求函数WSAAsyncGetXByY()、阻塞处理方法当一个应用程序的套接字调用处于阻塞时应能够使套接字放弃CPU让其他应用程序运行。WinSock的阻塞处理为:DLL初始化>循环操作。在循环中发送任何Windows消息并检查此WinSock调用是否完成必要时可以放弃CPU让其他应用程序执行。可以调用WSACancelBlockingCall()函数取消此阻塞处理。在WinSock中默认的阻塞处理例程BlockingHook()能够获取并发送Windows消息。如果要对复杂的程序进行处理WinSock中的WSASetBlockingHook()使得用户能够安装自己的阻塞处理例程与该函数相对应的则是WSAUnhookBlockingHook(),用于删除先前安装的任何阻塞处理例程并重新安装默认的处理例程。应注意设计自己的阻塞处理例程时除了WSACancelBlockingCall()以外不能使用其他的WinSockAPI函数。调用WSACancelBlockingCall()函数将取消处于阻塞的操作结束阻塞循环。、出错处理   WinSock为了和多线程环境兼容提供了WSAGetLastError()和WSASetLastError()两个出错处理函数来获取和设置当前线程的最近错误代码。    WSAGetLastError()函数的功能是返回故障类型其定义为:intWSAGetLastError(void)、启动与终止   使用WSAStartup()和WSACleanup()启动和终止套接字。WSAStartup()完成与WinsockDLL的连接WSACleanup()结束对WinsockDLL的调用。六、WinSock编程:WinSock包括开发组件和运行组件两大部分开发组件包括WinSock实现文档、应用程序接口(API)引入库和一些头文件。运行组件包括WinSock应用程序接口的动态连接库。在VC中使用WinSock编程时需要将以下三个文件包含到项目中(以WinSockV为例)头文件:Winsockh库文件:WSLIB动态库:WSDLL   在TCPIP网络中两个主机进行进程间异步通信时采用客户端服务器模式。其中服务器工作过程如下:、服务器方先开启打开一通信通道公布接收客户请求的端口地址、等待客户端发送请求到该端口、接收到客户端服务请求处理该请求并发送应答信号、重复、步处理多个客户请求、关闭服务器。客户端工作过程如下:、打开一通信通道连接到服务器所在主机的开放端口、向服务器发送服务请求等待应答信号、收到应答信号后关闭通信通道。下面看一看WinSock网络应用程序的详细步骤。、启动与终止:   必须首先使用启动函数WSAStartup(),它指定WinSockAPI的版本并获得Socket技术细节。调用方式为:        WORDwVersionRequested定义版本信息变量        WSADATAwsaData             定义数据信息变量        interr                                     定义错误号变量       wVersionRequested=MAKEWORD(,)       给版本信息赋值       err=WSAStartup(wVersionRequested,wsaData)      获取错误信息       if(err!=)return   程序可多次调用WSAStartup()函数但每次调用时wVersionRequested必须相同。、创建套接字:   Socketsock=socket(AFINET,SOCKSTREAM,IPPROTOIP)    流式套接字    if(sock==INVALIDSocket)  错误处理          …、套接字的绑定:    sockaddrinaddr   addrsinfamily=AFINET   addrsinport=htons()                                   保证字节顺序   addrsinaddrsaddr=addr(“”)  指定地址   intnResult=bind(s,(sockaddr*)addr,sizeof(sockaddr))、服务器端套接字的监听:   intnResult=listen(s,)   s是已绑定但未连接的套接字最多监听个连接、服务器端套接字等待连接:    sockaddrinaddr    Socketsd=accept(s,(sockaddr*)addr,sizeof(sockaddr))、客户端将两个套接字连接起来准备通信:    sockaddrinaddr   addrsinfamily=AFINET    addrsinport=htons()              保证字节顺序    addrsinaddrsaddr=htonl(INADDRANY)    intnResult=connect(s,(sockaddr*)addr,sizeof(sockaddr))、服务器端向客户端套接字发送数据:    charbuf=“einsun”指定缓冲区    intnResult=send(s,buf,strlen(buf))、客户端套接字接收数据:   charmess   intnResult=recv(s,mess,,)、服务器端和客户端中断套接字连接通知服务器端或客户端停止接收和发送数据:    intnResult=shutdown(s,SDBOTH)、服务器端或客户端关闭套接字释放所占有的资源:   intnResult=closesocket(s)s为要关闭的套接字   关闭套接字时所有已经打开并连接的流式套接字将被复位但那些已经由closesocket()函数关闭但仍有未发送数据的套接字不受影响仍然可发送未发完的数据。、出错处理   出错处理函数WSAGetLastError()的调用方式如下:   len=send(s,lpBuffer,len,)   if((len==socketERROR)         (WSAGetLastError()==WSAWOULDBLOCK))   {        ……    }

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/7

VC++网络编程

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利