




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Winsock是什么? Windows下网络编程的规范 Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。 已成为Windows网络编程的事实上的标准。 Windows socket规范 Windows Socket规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。Socket原理 Socket通常称为套接字、套管、插口,是两个程序间通信链路的端点。 Socket实际上是一个编程接口,为网络应用程序提供各种接口函数。Winsock基本概念 多数网络协议都由软件实现,而且几乎所有计算机系统都将网络协议的实现作为操作系统的一部分,操作系统提供给用户的程序接口叫做应用程序编程接口(API )。 套接字接口(Socket Interface)就是一种API套接字及类型 套接字(socket)是网络通信的基本构件,是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和与之相连的进程。 套接字存在于通信区域中,通信区域也称地址族 套接字通常只与同一区域中的套接字交换数据(也可跨区域通信,但要执行某种转换进程之后才能实现)。 TCP/IP的socket提供三种类型的套接字: 流式套接字(SOCK_STREAM) 提供一个面向连接的、可靠的数据传输服务, 内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。 文件传输协议(FTP)即使用流式套接字。 数据报式套接字(SOCK_DGRAM) 提供一个无连接服务。 数据报以独立包形式被发送,不提供无错保证,数据可能丢失或重复,且接收顺序混乱。 网络文件系统(NFS)使用数据报式套接字。 原始式套接字(SOCK_RAW) 该接口允许对较低层协议,如IP、ICMP直接访问。 常用于检验新的协议实现或访问现有服务中配置的新设备。 服务方式 面向连接(虚电路) 面向连接服务是电话系统服务模式的抽象,每一次完整的数据传输都要经过建立连接、使用连接、终止连接的过程。 在数据传输过程中,不携带目的地址,而使用连接号(connect ID)。 本质上,连接是一个管道,收发数据不但顺序一致,而且内容相同。TCP协议提供面向连接的虚电路。 无连接 无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系统中独立传送。 无连接服务不能保证分组的先后顺序,不进行分组出错的恢复和重传,不保证传输的可靠性。 UDP协议提供无连接的数据报服务。 Winsock寻址 计算机都分配有一个IP地址,用一个32位数来表示。 客户机需要通过TCP或UDP和服务器通信时,必须指定服务器的IP地址和服务端口号。 服务器打算监听接入客户机请求时,也必须指定一个IP地址和一个端口号。编写Winsock通信程序需要那些头文件和动态连接库? winsock2.h ,ws2_32.libTCP和UDP通信使用的API函数 socket()、bind()、listen()、accept()、send()、recv()、sendto()、recvfrom()、closesocket()Connect()函数的说明 在客户端使用该函数请求建立连接时,将激活建立连接的三次握手,用来建立到服务器TCP的连接。如果调用该函数前没有调用bind()来绑定本地地址,则由系统隐式绑定一个地址到该套接字 该函数用在UDP的客户端时,connect()函数并不是真正地发出建立请求连接的请求,调用将从本地操作系统直接返回。这样可以将服务器的地址信息保存下来,在后续UDP端口发送数据时,由套接字自动在发送函数中填入服务器地址,而不需要由应用程序在调用发送函数时填入面向连接的C/S程序工作流程(TCP) 服务器端工作流程 使用WSAStartup()加载Winsock库 使用socket()函数创建服务器端通信套接字 使用bind()函数将创建的套接字与服务器地址绑定 使用listen()函数使服务器套接字做好接收连接请求准备 使用accept()接收来自客户端由connect()函数发出的连接请求 根据连接请求建立连接后,使用send()函数发送数据,或者使用recv()函数接收数据 使用closesocket()函数关闭套接字(可以先用shutdown()函数先关闭读写通道) 最后调用WSACleanup()函数释放Winsock库 客户端程序工作流程 使用WSAStartup()函数加载Winsock库 使用socket()函数创建客户端套接字 使用connect()函数发出向服务器建立连接的请求(调用前可以不用bind()端口号,由系统自动完成) 连接建立后使用send()函数发送数据,或使用recv()函数接收数据 使用closesocet()函数关闭套接字 最后调用WSACleanup()函数释放Winsock库无连接的C/S程序工作流程(UDP)无连接的数据报传输服务通信时,客户端与服务器端所使用的函数是类似的,其工作流程如下: 使用WSAStartup()函数加载Winsock库 使用socket()函数创建套接字,以确定协议类型 调用bind()函数将创建的套接字与本地地址绑定,确定本地地址和本地端口号 使用sendto()函数发送数据,或者使用recvfrom()函数接收数据 使用closesocket()函数关闭套接字 调用WSACleanup()函数释放Winsock库UDP通信程序如何获取对方的地址信息? 在发送的时候若是广播的话是不会有对方IP地址的,一般用send进行发送,若是定点发送的话是可以将对方IP地址确定的UDP通信程序是不是一定要绑定套接字到本地地址?不一定UDP通信程序是否可以调用connect()? 如果没有预先绑定地址和端口,要先发送数据之后,才能确定己方UDP采用的地址和端口,因为地址和端口是第一次发送数据时分配的。如果不想通过发送数据来 确定地址和端口,可以调用connect函数,不过这样以后该SOCKET只能跟connect函数中指定的端口和地址通信了。套接字模式 Winsock提供了两种套接字模式:阻塞和非阻塞模。 Windows平台支持套接字以两种工作。 在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等候下去,不会立即返回。 非阻塞模式下, Winsock函数会立即返回。阻塞模式 在一个阻塞套接字上调用任何一个Winsock API函数,都会产生相同的后果“等待”。 大多数Winsock应用都是遵照一种“生产者消费者”模型来编制的。在这种模型中,应用程序需要读取(或写入)指定数量的数据,然后以它为基础执行一些计算。为了防止由于数据的缺乏造成应用程序完全陷于“凝固”状态,同时不必连续性地检查系统网络缓冲。可采用如下方法 将应用程序划分为一个读线程,以及一个计算线程,两个线程都共享同一个数据缓冲区。对这个缓冲区的访问需要受到一定的限制,用同步对象来控制访问,比如Mutex。 读线程从网络连续地读入数据,并将其置入共享缓冲区内。读线程取得计算线程开始工作至少需要的数据量后,便触发一个事件,通知计算线程。 随后,计算线程从缓冲区取走(删除)一个数据块,然后进行计算。非阻塞模式 非阻塞模式套接字除具备阻塞套接字已有的各项优点之外,还进行了少许扩充,功能更强。 套接字工作在非阻塞模式时, Winsock API调用会立即返回。大多数情况下,这些调用都会“失败”,并返回一个WSAEWOULDBLOCK错误。 设置非阻塞套接字阻塞与非阻塞通信小结 通信包括阻塞和非阻塞两种模式。对于不同的协议,阻塞通信和非阻塞通信有不同的表现。 对于UDP协议,由于UDP没有发送缓存,因此所有UDP协议即使在阻塞模式下也不会发生阻塞。 对于面向连接的协议,连接建立阶段,阻塞与非阻塞也表现不一。在阻塞模式下,如果没有连接请求到达,则等待连接调用将阻塞直到有连接请求到达;但在非阻塞模式下,如果没有连接请求到达,等待连接调用将直接返回。 在连接建立阶段,不管是阻塞模式还是非阻塞模式,发起连接请求的一方总是会使调用它的进程阻塞,阻塞间隔最少等于到达服务器的一次往返时间。 通信模式对应用程序的设计方法也有直接的影响。在非阻塞模式下,应用程序必须不断地轮询是否有数据到达或有连接请求到达。 这种轮询的方式耗费的CPU资源较大,要尽可能避免使用,而在阻塞模式下则不存在这一问题,但其缺点是进程或线程在执行I/O操作时将被阻塞而不能执行其他的工作,因此在单进程或单线程应用中不能使用这种模式。 在多线程应用中比较适合采用阻塞模式,一个线程被阻塞不影响其他线程的工作。 套接字I/O模型 Select模型,WSAAsynSelect模型,WSAEventSelect模型,重叠模型,完成端口模型。Select模型 Select模型是WinSock中最常见的I/O模型。 通过调用Select函数可以确定一个或多个套接字的状态,判断套接字上是否存在数据,或者能否向一个套接字写入数据。 既能防止应用程序在套接字处于阻塞模式时,在一次I/O操作后被阻塞,同时也能防止在套接字处于非阻塞模式时,产生WSAEWOULDBLOCK错误。使用select模型的编程步骤: 建立fd_set集合s,用来存放欲使用的套接字。 将套接字添加到集合s中。 确定要检查的套接字集合Xi(1= i 0)HandleData(buff);/HandleData()为数据处理函数/ 关闭套接字closesocket(s);return 0;2、请解释int listen(SOCKET sockfd,int backlog)中backlog的具体含义。 指定了正在等待连接的最大队列长度,它的作用在于处理可能同时出现的几个连接请求。3、调用connect()时触发什么过程? 三次握手过程4、UDP编程时可否使用connect(),为什么? 可以使用。因为UDP的客户端调用connect()函数时,并不是真正地发出建立请求连接的请求,调用将从本地操作系直接返回。这样可以将服务器的地址信息保存下来,在后续UDP端口发送数据时,由套接字自动在发送函数中填入服务器地址,而不需要由应用程序在调用发送函数时填入。5、recvfrom()填入的地址的作用是什么? 用于返回发送方的地址(IP、PORT),如果不关心发送方地址时可设置地址参数为NULL;如果需要回复信息则要填入参数以便sendto时使用。6、调用recvfrom()之前是否必须绑定?为什么? 不一定必须绑定。若在调用recvfrom()之前没有调用sendto()就必须调用bind()显式绑定;若在调用recvfrom()之前调用了sendto()则由系统自动绑定,不必显式绑定。从以下方面比较WSAAsyncSelect模型和WSAEventSelect模型的异同。 能处理的网络事件类型相同,常用网络事件包括FD_ACCEPT、FD_READ、FD_WRITE、FD_CLOSE 得到网络事件通知的途径不同。WSAAsyncSelect模型由操作系统捕获网络事件并封装成WINDWOS消息,发送到窗口程序的消息队列中,应用程序从其消息队列中取出消息从而获得网络事件通知;而WSAEventSelect模型是通过等待关联的事件状态变化来获取事件通知。 单线程能处理的套接字个数不同,WSAEventSelect模型为64, WSAAsyncSelect模型没有限制。 判断网络事件类型和网络错误方法不同。WSAEventSelect模型通过调用WSAEnumNetworkEvents()函数传入的指向WSANETWORKEVENTS结构体的指针lpNetworkEvents来返回网络网络事件和错误代码。if(lpNetworkEvents- lNetworkEvents &FD_*),则表示发生了对应的网络事件;if(lpNetworkEvents-iErrorCodeFD_*_BIT!=0)表示发生了网络错误。WSAAsyncSelect模型通过MSG的附加信息来判断网络事件和网络错误。p wParam指定发生网络事件的套接字句柄p LParam指定发生的网络事件和错误代码。 其中高字位指出网络错误。采用宏:if(WSAGETSELECTERROR(lParam)表示发生网络错误 低字位指出发生的网络事件,采用宏: if(WSAGETSELECTEVENT(lParam) = FD_*)表示发生对应的网络事件。 触发FD_READ和FD_WRITE的条件(具体说明)5、触发FD_READ和FD_WRITE的条件(具体说明) 收到FD_READ事件通知的情况:(1)调用 WSAAsyncSelect()对 socket 注册 FD_READ 事件时,接收缓冲区中已有数据。 (2)接收缓冲区由空变为有数据(3)调用 recv()或 recvfrom()从接收缓冲区读取数据时没有读完。 收到FD_WRITE事件通知的情况: 使用connect或WSAConnect,一个套接字首次建立了连接。(针对客户端) 使用accept或WSAAccept,套接字被接受以后。 若send、WSASend、sendto或WSASendTo操作失败,返回了WSAEWOULDBLOCK错误,而且缓冲区的空间变得可用。在TCP服务器编程时,可以对每个accept()返回的套接字创建线程来处理该套接字上的数据收发,这样做有什么缺点?第三章的IO模型中哪些模型能改善这一缺点?为什么?A:缺点:线程膨胀。所有IO模型均可以改善这一缺点。 Select模型:通过设置套接字集合,可以在一个集合中管理64(default)个套接字。通过自定义FD_SETSIZE管理更多的套接字。 WSAAsyncSelect模型:采用消息机制,调用WSAAsyncSelect()将套接字和窗口句柄关联起来,理论上可以管理的套接字数目没有限制,只是服务器性能会下降。 WSAEventSelect模型:将每个套接字和一个事件对象关联,该模型最多等待64个套接字,也就是最多处理64套接字。连接套接字增加时可以使用线程池技术。 重叠IO模型:使用重叠结构投递IO请求后,重叠结构中事件对象受信,查询重叠操作结果,处理数据。采用单线程可以管理多个套接字,将套接字和套接字使用的IO缓冲区以对象的形式组织成链表,通过套接字来创建其对应的缓冲区对象(包含一个重叠结构)。1、Q:套接字工作在阻塞模式下,列举5个会阻塞的Winsock API函数。A:accept(),send(),recv(),sendto(),recvfrom()注意在非阻塞模式下这些函数不会阻塞。2、Q:列举ioctlsocket()函数两种用途。A:1、设置套接字的工作模式2、获取套接字上可读取的数据量3、Q: TCP编程时客户端程序是否需要调用bind()函数?为什么?A:不需要,调用connect()函数时会隐式绑定。4、Q:重叠操作使用的重叠结构上的事件对象状态由无信号状态变为有信号状态,是否意味着这一次重叠操作成功完成?为什么?A:不一定。事件对象状态由无信号状态变为有信号状态仅仅意味着这次操作完成。完成有两个成功和失败两种可能,因此编程时查询重叠操作结果后对返回值进行判断处理。5、Q:解决套接字工作在非阻塞模式下的WSAEWOULDBLOCK错误需要解决什么根本问题?如何有效解决?A:解决套接字上何时可以读写数据。使用IO模型。Q:完成端口中per-handle数据和per-IO数据各有什么作用? 客户上下文对象(单句柄数据):主要作用在于关联完成端口时传递套接字信息,在查询完成端口时该套接字信息会通过lpCompletionKey参数返回。 缓冲区对象(单IO数据):主要作用在于投递重叠IO时传递IO信息,包括缓冲区,IO类型、OVERLAPPED结构等等。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理暗示与心理健康课件
- 出国工作还债协议书范本
- 拆迁渣土买卖协议书范本
- 心理健康面试培训课件
- 中药材投资协议书范本
- 管理种茶叶协议书范本
- 2025年航空滤网钢丝合作协议书
- 2025年石油钻探、开采专用设备合作协议书
- 空气净化管理课件
- 二零二五年度出租车车辆更新换代承包合同
- 用工死亡赔偿协议书范本
- 【邯郸】2025年河北邯郸冀南新区公开招聘事业单位工作人员125人笔试历年典型考题及考点剖析附带答案详解
- 浙江省装修垃圾管理办法
- 循环系统重症病人的护理
- 网络安全系统设计重点、难点及控制措施
- 2025年高考真题-化学(湖南卷) 含答案
- 2025至2030中国药膳行业市场发展现状及竞争格局与投资发展报告
- 乡镇村村响管理制度
- 2023年银行业法律法规与综合能力考试考试题库(真题整理)
- 光器件基础知识培训
- 金蝶kis专业版操作手册
评论
0/150
提交评论