WinSock网络编程实用宝典.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《WinSock网络编程实用宝典.pdf》由会员分享,可在线阅读,更多相关《WinSock网络编程实用宝典.pdf(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、WinsocketWinsocketWinsocketWinsocket 编程之编程之 TCP/IPTCP/IPTCP/IPTCP/IP 体系结构体系结构一、一、一、一、TCP/IPTCP/IPTCP/IPTCP/IP 体系结构与特点体系结构与特点体系结构与特点体系结构与特点1、TCP/IP体系结构TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中 TCP 是提供传输层服务,而 IP 则是提供网络层服务。TCP/IP 包括以下协议:(结构如图 1.1)(图 1.1)IP:网间协议(Internet Protocol)负责主机间数据的路由和网络上数据的存储。同时为 ICMP,TCP,
2、UDP 提供分组发送服务。用户进程通常不需要涉及这一层。ARP:地址解析协议(Address Resolution Protocol)此协议将网络地址映射到硬件地址。RARP:反向地址解析协议(ReverseAddressResolution Protocol)此协议将硬件地址映射到网络地址ICMP:网间报文控制协议(Internet Control Message Protocol)此协议处理信关和主机的差错和传送控制。TCP:传送控制协议(Transmission Control Protocol)这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务,并为
3、数据可靠传输建立检查。(注:大多数网络用户程序使用 TCP)UDP:用户数据报协议(User Datagram Protocol)这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。FTP:文件传输协议(File Transfer Protocol)允许用户以文件操作的方式(文件的增、删、改、查、传送等)与另一主机相互通信。SMTP:简单邮件传送协议(Simple Mail TransferProtocol)SMTP 协议为系统之间传送电子邮件。TELNET:终端协议(Telnet Terminal Procotol)允许用户以虚终端方式访问远程主机HTTP:超文本传输协议(Hyp
4、ertext Transfer Procotol)TFTP:简单文件传输协议(Trivial File Transfer Protocol)2、TCP/IP特点TCP/IP 协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三 层通常是在操作系统内核中实现。因此用户一般不涉及。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函 数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。图 1.2 是 TCP/IP协议核心与应用程序关系图。(图 1.2)二、专用术语二
5、、专用术语二、专用术语二、专用术语1、套接字套接字是网络的基本构件。它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连听进程。套接字存在通信区域(通信区 域又称地址簇)中。套接字只与同一区域中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。WINDOWS 中的套接字只支持一个域网际域。套接字具有类型。WINDOWS SOCKET 1.1 版本支持两种套接字:流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)2、WINDOWS SOCKETS 实现一个 WINDOWS SOCKETS 实现是指实现了 WINDOWS SOCKETS 规范
6、所描述的全部功能的一套软件。一般通过 DLL 文件来实现3、阻塞处理例程阻塞处理例程(blocking hook,阻塞钩子)是 WINDOWS SOCKETS 实现为了支持阻塞套接字函数调用而提供的一种机制。4、多址广播(multicast,多点传送或组播)是一种一对多的传输方式,传输发起者通过一次传输就将信息传送到一组接收者,与单点传送(unicast)和广播(Broadcast)相对应。WinsocketWinsocketWinsocketWinsocket 编程之套接字原理编程之套接字原理一、客户机一、客户机一、客户机一、客户机/服务器模式服务器模式服务器模式服务器模式在 TCP/IP
7、网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(过程如下)1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2、等待客户请求到达该端口。3、接收到重复服务请求,处理该请求并发送应答信号。4、返回第二步,等待另一客户请求5、关闭服务器。客户方:1、打开一通信通道,并连接到服务器所在主机的特定端口。2、向服务器发送服务请求报文,等待并接收应答;继续提出请求3、请求结
8、束后关闭通信通道并终止。二、基本套接字二、基本套接字二、基本套接字二、基本套接字为了更好说明套接字编程原理,给出几个基本的套接字,在以后的篇幅中会给出更详细的使用说明。1、创建套接字socket()功能:使用前创建一个新的套接字格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);参数:af:通信发生的区域type:要建立的套接字类型procotol:使用的特定协议2、指定本地地址bind()功能:将套接字地址与所创建的套接字号联系起来。格式:intPASCALFARbind(SOCKET s,const struct sockad
9、dr FAR*name,int namelen);参数:s:是由 socket()调用返回的并且未作连接的套接字描述符(套接字号)。其它:没有错误,bind()返回 0,否则 SOCKET_ERROR地址结构说明:struct sockaddr_inshortsin_family;/AF_INETu_shortsin_port;/16 位端口号,网络字节顺序struct in_addr sin_addr;/32 位 IP 地址,网络字节顺序char sin_zero8;/保留3、建立套接字连接connect()和 accept()功能:共同完成连接工作格式:intPASCALFARconnec
10、t(SOCKET s,const struct sockaddr FAR*name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,structsockaddr FAR*name,intFAR*addrlen);参数:同上4、监听连接listen()功能:用于面向连接服务器,表明它愿意接收连接。格式:intPASCALFARlisten(SOCKET s,intbacklog);5、数据传输send()与 recv()功能:数据的发送与接收格式:intPASCALFARsend(SOCKET s,const char FAR*buf,int len
11、,int flags);intPASCALFARrecv(SOCKET s,const charFAR*buf,int len,int flags);参数:buf:指向存有传输数据的缓冲区的指针。6、多路复用select()功能:用来检测一个或多个套接字状态。格式:intPASCALFARselect(int nfds,fd_set FAR*readfds,fd_set FAR*writefds,fd_setFAR*exceptfds,const struct timeval FAR*timeout);参数:readfds:指向要做读检测的指针writefds:指向要做写检测的指针except
12、fds:指向要检测是否出错的指针timeout:最大等待时间7、关闭套接字closesocket()功能:关闭套接字 s格式:BOOL PASCAL FAR closesocket(SOCKET s);三、典型过程图三、典型过程图三、典型过程图三、典型过程图2.1 面向连接的套接字的系统调用时序图2.2 无连接协议的套接字调用时序图2.3 面向连接的应用程序流程图WindowsWindowsWindowsWindows Socket1.1Socket1.1Socket1.1Socket1.1 程序设计程序设计一、简介一、简介一、简介一、简介Windows Sockets 是从 Berkeley
13、 Sockets 扩展而来的,其在继承 Berkeley Sockets 的基础上,又进行了新的扩充。这些扩充主要是提供了一些异步函数,并增加了符合 WINDOWS消息驱动特性的网络事件异步选择机制。Windows Sockets 由两部分组成:开发组件和运行组件。开发组件:Windows Sockets 实现文档、应用程序接口(API)引入库和一些头文件。运行组件:Windows Sockets 应用程序接口的动态链接库(WINSOCK.DLL)。二、主要扩充说明二、主要扩充说明二、主要扩充说明二、主要扩充说明1、异步选择机制:Windows Sockets 的异步选择函数提供了消息机制的网
14、络事件选择,当使用它登记网络事件发生时,应用程序相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。Windows Sockets 提供了一个异步选择函数 WSAAsyncSelect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口函数将收到一个消息。函数结构如下:intPASCALFARWSAAsyncSelect(SOCKET s,HWND hWnd,unsignedintwMsg,long lEvent);参数说明:hWnd:窗口句柄wMsg:需要发送的消息lEvent:事件(以下为事件的内容)值:含义:FD_READ期望在套接
15、字上收到数据(即读准备好)时接到通知FD_WRITE期望在套接字上可发送数据(即写准备好)时接到通知FD_OOB期望在套接字上有带外数据到达时接到通知FD_ACCEPT期望在套接字上有外来连接时接到通知FD_CONNECT 期望在套接字连接建立完成时接到通知FD_CLOSE期望在套接字关闭时接到通知例如:我们要在套接字读准备好或写准备好时接到通知,语句如下:rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);如果我们需要注销对套接字网络事件的消息发送,只要将 lEvent 设置为 02、异步请求函数在 Berkeley Sockets 中请求服务是阻
16、塞的,WINDOWS SICKETS 除了支持这一类函数外,还增加了相应的异步请求函数(WSAAsyncGetXByY();)。3、阻塞处理方法Windows Sockets 为了实现当一个应用程序的套接字调用处于阻塞时,能够放弃 CPU让其它应用程序运行,它在调用处于阻塞时便进入一个叫“HOOK”的例程,此例程负责接收和分配 WINDOWS 消息,使得其它应用程序仍然能够接收到自己的消息并取得控制权。WINDOWS 是非抢先的多任务环境,即若一个程序不主动放弃其控制权,别的程序就不能执行。因此在设计 Windows Sockets 程序时,尽管系统支持阻塞操作,但还是反对程序员使用该操作。但
17、由于 SUN 公司下的 Berkeley Sockets 的套接字默认操作是阻塞的,WINDOWS 作为移植的 SOCKETS 也不可避免对这个操作支持。在 Windows Sockets 实现中,对于不能立即完成的阻塞操作做如下处理:DLL 初始化循环操作。在循环中,它发送任何 WINDOWS 消息,并检查这个 Windows Sockets 调用是否完成,在必要时,它可以放弃 CPU 让其它应用程序执行(当然使用超线程的 CPU 就不会有这个麻烦了_)。我们可以调用 WSACancelBlockingCall()函数取消此阻塞操作。在 Windows Sockets 中,有一个默认的阻塞处
18、理例程 BlockingHook()简单地获取并发送WINDOWS消 息。如 果 要 对 复 杂 程 序 进 行 处 理,Windows Sockets中 还 有WSASetBlockingHook()提供用户安装自己的阻塞处理例程能力;与该函数相对应的则是SWAUnhookBlockingHook(),它用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程。请注意,设计自己的阻塞处理例程 时,除了函数 WSACancelBlockingHook()之外,它 不 能 使 用 其 它 的Windows Sockets API函 数。在 处 理 例 程 中 调 用WSACancelBloc
19、kingHook()函数将取消处于阻塞的操作,它将结束阻塞循环。4、出错处理Windows Sockets 为了和以后多线程环境(WINDOWS/UNIX)兼容,它提供了两个出错处理函数来获取和设置当前线程的最近错误号。(WSAGetLastEror()和 WSASetLastError())5、启动与终止使用函数 WSAStartup()和 WSACleanup()启动和终止套接字。三、三、三、三、WindowsWindowsWindowsWindows SocketsSocketsSocketsSockets 网络程序设计核心网络程序设计核心网络程序设计核心网络程序设计核心我们终于可以开始
20、真正的 Windows Sockets 网络程序设计了。不过我们还是先看一看每个Windows Sockets 网络程序都要涉及的内容。让我们一步步慢慢走。1、启动与终止在所有 Windows Sockets 函数中,只有启动函数 WSAStartup()和终止函数 WSACleanup()是必须使用的。启动函数必须是第一个使用的函数,而且它允许指定 Windows SocketsAPI 的版本,并获得SOCKETS 的特定的一些技术细节。本结构如下:intPASCALFARWSAStartup(WORD wVersionRequested,LPWSADATAlpWSAData);其中 wVe
21、rsionRequested 保证 SOCKETS 可正常运行的 DLL 版本,如果不支持,则返回错误信息。我们看一下下面这段代码,看一下如何进行 WSAStartup()的调用WORD wVersionRequested;/定义版本信息变量WSADATAwsaData;/定义数据信息变量interr;/定义错误号变量wVersionRequested=MAKEWORD(1,1);/给版本信息赋值err=WSAStartup(wVersionRequested,&wsaData);/给错误信息赋值if(err!=0)return;/告诉用户找不到合适的版本/确认 Windows Sockets
22、 DLL 支持 1.1 版本/DLL 版本可以高于 1.1/系统返回的版本号始终是最低要求的 1.1,即应用程序与 DLL 中可支持的最低版本号if(LOBYTE(wsaData.wVersion)!=1|HIBYTE(wsaData.wVersion)!=1)WSACleanup();/告诉用户找不到合适的版本return;/WindowsSockets DLL 被进程接受,可以进入下一步操作关闭函数使用时,任何打开并已连接的 SOCK_STREAM 套接字被复位,但那些已由closesocket()函数关闭的但仍有未发送数据的套接字不受影响,未发送的数据仍将被发送。程 序 运 行 时 可
23、能 会 多 次 调 用WSAStartuo()函 数,但 必 须 保 证 每 次 调 用 时 的wVersionRequested 的值是相同的。2、异步请求服务Windows Sockets 除支持 Berkeley Sockets 中同步请求,还增加了了一类异步请求服务函数WSAAsyncGerXByY()。该函数是阻塞请求函数的异步版本。应用程序调用它时,由 WindowsSockets DLL 初始化这一操作并返回调用者,此函数返回一个异步句柄,用来标识这个操作。当结果存储在调用者提供的缓冲区,并且发送一个消息到应用程序相应窗口。常用结 构如下:HANDLE taskHnd;char
24、hostname=rs6000;taskHnd=WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen);需要注意的是,由于 Windows 的内存对像可以设置为可移动和可丢弃,因此在操作内存对象是,必须保证 WIindows Sockets DLL 对象是可用的。3、异步数据传输使用 send()或 sendto()函数来发送数据,使用 recv()或 recvfrom()来接收数据。Windows Sockets 不鼓励用户使用阻塞方式传输数据,因为那样可能会阻塞整个 Windows环境。下面我们看一个异步数据传输实例:假设套接字 s 在连接
25、建立后,已经使用了函数 WSAAsyncSelect()在其上注册了网络事件FD_READ 和 FD_WRITE,并且 wMsg 值为 UM_SOCK,那么我们可以在 Windows 消息循环中增加如下的分支语句:case UM_SOCK:switch(lParam)case FD_READ:len=recv(wParam,lpBuffer,length,0);break;case FD_WRITE:while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR)break;break;4、出错处理Windows 提供了一个函数来获取最近的错误码 WSAGetL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WinSock 网络 编程 实用 宝典
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内