网络程序设计期末复习题汇编
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络程序设计期末复习题
第一章网络基础
(1)计算机网络程序设计是利用网络应用编程接口编写网络应用程序,实现网络应用进程间的信息交互功能。
(2)网络编程基于网络协议,网络编程接口访问网络协议提供的服务。
(3)简述OSI七层协议的主要功能:
(4)网络互联的目的是提供一个无缝的通信系统。
为此,必须用互联网协议屏蔽物理网络的具体细节,并提供一个虚拟网络的功能。
(5)每个IP地址被分割成前缀和后缀两部分。
前缀用于确定计算机从属的物理网络,后缀则用于确定网络上一台单独的计算机。
(6)IP中主机地址为0的地址表示网络地址。
(7)网络号后跟一个所有位全是1的后缀,就是直接广播地址。
(8)地址解析(Address Resolution)就是将计算机中的协议地址翻译成物理地址(或称MAC地址,即媒体映射地址)。
(9)一个系统的全域名由主机名、域名和扩展名三部分组成,各部分间使用“.”分隔,例如。
(10)在TCP/IP应用中,域名系统(DNS)是一个分布的数据库,由它来提供IP地址和主机名之间的映射信息。
(11)以太网数据帧的长度必须在46~1518字节之间。
(12)TCP和UDP都用一个16位的端口号来表示不同的应用程序。
(13)TCP和UDP把源端口号和目的端口号分别存入报文首部中。
(14)网络接口分别要发送和接收IP、ARP和RARP数据,因此也必须在以太网的帧首部中加入16 bit 的帧类型域以指明生成数据的网络层协议。
(15)当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。
每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。
这个过程称作分用(Demultiplexing)。
(16)TCP和UDP采用端口号来识别应用程序。
(17)任何TCP/IP实现所提供的服务都使用通用端口号1~1023。
(18)IEEE 802.3定义了一种具有七个字段的帧(MAC):前导符、起始帧分界符、目标地址、源地址、PDU的长度/类型、数据以及CRC。
(19) IPv4中包含至少12个不同字段,且在没有选项时长度为20个字节,但在包含选项时可达60个字节。
(20)解释IP数据报格式中的标志(FLG)的含义:包括3个1位标志,标识报文是否允许被分段和是否
使用了这些域。
第一位保留并设为0;第二位标识报文能否被分段,其中0表示报文可以被分段,1表示报文不能被分段;第三位只有在第二位为0时才有意义,这一位标识此报文是否是这一系列分段的最后一个,或者接收应用程序是否还希望有更多的段,0指示报文是最后一个。
(21)分段偏移量(Fragment Offset):指定分段在整个数据报中的位置。
接收主机同时使用标志位和分段偏移,以重组被分段的数据报。
这个值以64位为单位递增。
(22)生命周期(TTL,Time To Live):代表数据报在被丢弃前能够穿越的最大主机跳数。
(23)TTL的初始值由源主机设置,其理论最大值为255,每经过一个处理节点减1。
(24)IP数据报格式中设置头校验和(Header Checksum)的目的是保证报头的正确性,目的机、网络中的每个网关都要重新计算报头的校验和,如果计算出的校验和与报文所含的校验和不同,则丢弃该报文。
(25)IP数据报格式中设置填充区(Padding)的目的是为了保证IP头长度是32位的整数倍,要填充额外的0。
(26)ICMP作为IP协议的附属协议,用来与其他主机或路由器交换错误报文和其他重要信息。
(27)IP层协议的另一个附属协议是IGMP(Internet组管理协议),它用来把一个UDP数据报多播或组播到多个主机。
(28)TCP使用IP作为网络层协议。
TCP的全称是Transmission Control Protocol,即传输控制协议。
(29)IP首部中的源端口字段和源IP地址的作用是标识发送报文的计算机及应用程序。
(30)IP首部中的目标端口字段和目标IP地址的作用是标识接收报文的计算机及应用程序。
(31)如果将字节流看作在两个应用程序间的单向流动,则TCP用序号字段对每个字节进行计数。
(32)在动态路由网络中,报文很可能使用不同的路由,因此,报文可能乱序。
利用序号字段可以纠正传输导致的乱序,从而重组分段的报文。
(33)确认序号应当是上次已成功收到的数据字节序号加1。
只有ACK标志置1时此字段才有效。
(34)发送ACK无需任何代价,因此,一旦连接建立,该字段总是被设置,ACK标志也总是置1 。
(35)窗口(Window)是16位字段,它表明接收端声明可以接收的TCP数据段的大小,最大为65 535字节。
(36)校验和对整个TCP报文段进行,包括TCP首部和TCP数据。
如果收到的内容没有被改变过,双方的计算结果应完全一样,保证了数据的有效性。
(37)校验和(Checksum)是16位的字段,它是一个强制性的字段,由发送端计算存储,由接收端进行验证。
(38)可靠传输服务软件所应具有的特征如下:(1) 面向数据流:数据流(stream)就是两个应用程序间传输的数据。
(2) 电路连接:包括连接的建立、通信的开始及连接的结束都要求所建立的连接是可靠的,连接的结束要完美(在连接终止前传送的所有数据均为可靠的)。
(3) 带缓冲的传送。
(4) 无结构的数据流,即不考虑数据内容。
(5) 全双工连接:包含两个独立且方向相反的连接。
(39)TCP提供一个可靠连接的方式是通过三次握手(Three-way Handshake)来完成的。
(40)建立一个TCP连接需要三次握手,而正常终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)特性造成的。
(41)UDP协议只负责接收和传送由上层协议传递的消息,它本身不做任何检测、修改与应答,上层协议需要自己处理这些事务。
(42)UDP的报头格式较简单,主要是地址信息、包的长度和校验信息。
与此对应,TCP包的头信息有10多个域。
(43)理论上,IP数据报的最大长度为65 535字节,这是由IP首部16位字段所限制的。
去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最大长度为65 507字节。
但大多数实现所提供的长度比这个最大值小,这主要是因为存在两个限制因素:一个是因为应用程序可能会受到其程序接口的限制,Socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。
现在的大部分系统都默认提供了可读/写大于8192字节的UDP数据报。
另一个限制来自于TCP/IP的内核,
不同的系统可能存在一些实现特性的差异,使IP数据报长度小于65 535字节。
(44)ARP(Address Resolution Protocol,地址解析协议)和RARP(Reverse Address Resolution Protocol,逆向地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。
(45)源抑制是一个流控制信息,由接收方向源主机发送该信息来请求源主机停止发送数据。
当接收主机在其缓冲区快满时发送该信息。
(46)路径重定向是由网关向请求其提供服务的主机发送,用于通知该主机在网络中还有其他距离目的主机更近的网关。
(47)为了防止由于ICMP差错报文响应所引发的广播风暴,协议规定当接收端收到下列报文时不会产生ICMP差错报文:
(1) ICMP差错报文(但ICMP查询报文可能会产生ICMP差错报文)。
(2) 目的地址是广播地址或多播地址的IP数据报。
(3) 作为链路层广播的数据报。
(4) 不是IP数据报第一个分片的数据报。
(5) 源地址不是单个主机的数据报。
这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
(48)网络通信常常是在多个平台之间进行的,因此网络应用程序必须考虑不同平台之间的异构性,这些差异主要表现在哪些方面?(1)字节顺序。
不同的平台以不同的方式存放一个二进制数。
最常见的有两种格式:大数在前(big-endian)的字节顺序和小数在前(little-endian)的字节顺序。
大数在前的字节顺序是指将一个多字节数的高序字节存储在内存的起始地址;而小数在前的字节顺序则相反,将低序字节存储在内存的起始地址。
因此,作为网络编程人员,必须清楚各种字节顺序间的区别,并采用相应的措施来解决因这种差别所带来的问题。
(2)字的长度。
不同的实现对于相同的数据类型可能有不同的表示长度。
例如32位和64位操作系统中,类型long int的长度是不一样的。
(3)字节定界问题。
不同的平台上为结构体(struct)或共同体(union)打包的方式也是不同的,这取决于所有数据类型的位数及机器的定界限制。
(4)另一种解决该问题的方法是将需要发送的信息的结构在发送前变换成一种统一的格式(转换成一个字符数组),到达接收方后再执行相反的过程。
对于数据结构中有比特变量的情况,处理起来更加复杂,因此,在实际网络编程中尽量不要使用比特变量。
在很多网络协议的设计中,常常需要填充一些无用的字节以满足四字节定界,从而简化协议的实现。
(49)网络编程应考虑的问题有哪些?(1)并发环境下的网络编程。
单进程应用与多进程或多线程应用程序的编程有着很大的区别。
在多进程或多线程应用程序中,涉及到资源共享、进程或线程间的同步,因而要复杂得多。
在多进程或多线程应用中,使用的系统调用或函数必须是可重入的。
不同系统中可重入的系统调用或系统函数是不同的,一般都会有详细的说明。
对于那些不可重入的调用或函数,系统如果不提供多线程安全的版本,则应用编程人员需要避免使用或自己编写相应的函数;(2)异构环境下的网络编程。
字节顺序、字的长度、字节定界问题等。
(3)阻塞与非阻塞通信。
(4)服务类型的选择;(5)差错处理
第2章WINSOCK基础
(1)套接字(socket)是网络通信的基本构件,是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和与之相连的进程。
(2)Windows Sockets只支持一个通信区域:网际域(AF-INET),这个域被使用网际协议族通信的进程所使用。
(3)TCP/IP的socket提供三种类型的套接字:
* 流式套接字(SOCK_STREAM):提供一个面向连接的、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。
内设流量控制,避免数据流超限;数据被看作是字节流,无长度限
制。
文件传输协议(FTP)即使用流式套接字。
* 数据报式套接字(SOCK_DGRAM):提供一个无连接服务。
数据报以独立包形式被发送,不提供无错保证,数据可能丢失或重复,且接收顺序混乱。
网络文件系统(NFS)使用数据报式套接字。
* 原始式套接字(SOCK_RAW):该接口允许对较低层协议,如IP、ICMP 直接访问。
常用于检验新的协议实现或访问现有服务中配置的新设备。
(4)TCP/IP协议提出可协议端口(protocol port,简称端口)的概念,用于标识通信的进程。
(5)在TCP/IP协议的实现中,端口操作类似一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件。
(6)类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同的端口。
(7)由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立。
(8)端口号的分配是个重要问题,有两种基本分配方式:全局分配和本地分配。
(9)网络中用一个三元组(协议,本地地址,本地端口号)可以在全局唯一标志一个进程,这个三元组叫半相关(half-association),它指定连接的每半部分。
(10)一个完整的网间通信需要用一个五元组(协议,本地地址,本地端口号,远地地址,远地端口号)来标识,这个五元组叫全相关(association),即两个协议相同的半相关才能组成一个合适的相关,或完全指定组成一连接。
(11)在字节流服务中,由于没有报文边界,用户进程在某一时刻可以读/写任意数量的字节。
(12)为保证传输正确或采用有流控制的协议,都要进行缓存。
但对某些特殊的需求,如交互式应用程序,又会要求取消这种缓存。
(13)客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软/硬件资源、运算能力和信息不均等,需要共享,从而形成拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对称的情况。
其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。
(14)客户机/服务器模式在操作过程中采取主动请求方式:
(1) 服务器方启动,并根据请求提供相应的服务,其工作流程如下:* 打开一通信通道并告知本地主机,它愿意在某公认地址(如FTP:21)上接收客户请求。
* 等待客户请求到达该端口。
* 接收到重复服务请求,处理该请求并发送应答信号。
接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。
新进程处理此客户请求,并不需要对其他请求作出应答。
* 返回第二步,等待另一客户请求。
* 关闭服务器。
(2) 客户机方工作流程如下:* 打开一通信通道,并连接到服务器所在地的主机特定端口。
* 向服务器发送服务请求报文,等待并接收应答,继续提出请求。
* 请求结束后关闭通信通道并终止。
从上面描述的过程可知:* 客户机与服务器进程的作用是非对称的,因此编码不同。
* 服务进程一般是先于客户机请求而启动的,只要系统运行,该服务进程一直存在,直到正常终止或强迫终止。
(15)Windows Sockets由两部分组成:开发组件和运行组件。
开发组件:Windows Sockets 实现文档、应用程序接口(API)引入库和一些头文件。
运行组件:Windows Sockets应用程序接口的动态链接库(Winsock.dll)。
(16)Windows Sockets的异步选择函数提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件以及与事件相关的一些信息。
(17)Windows Sockets提供了一个异步选择函数WSAAsyncSelect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口函数将收到一个消息。
(18)异步请求函数允许应用程序用异步方式获得请求的信息,且在请求的服务完成时给应用程序
相应的窗口函数发送一个消息。
(19)Windows是非抢先的多任务环境,即若一个程序不主动放弃其控制权,别的程序就不能执行。
(20)在设计Windows Sockets程序时,尽管系统支持阻塞操作,但还是不提倡程序员使用该操作。
(21)Windows Sockets如何实现阻塞处理:Windows Sockets为了实现当一个应用程序的套接字调用处于阻塞时,能够放弃CPU让其他应用程序运行,它在调用处于阻塞时便进入一个叫“HOOK”的例程,此例程负责接收和分配Windows消息,这使得其他应用程序仍然能够接收到自己的消息并取得控制权。
(22)在Windows Sockets中,有一个默认的阻塞处理例程BlockingHook()可简单地获取并发送Windows消息。
如果要对复杂的程序进行处理,Windows Sockets中还有WSASetBlockingHook()函数可供用户安装自己的阻塞处理例程;与该函数相对应的则是WSAUnhookBlockingHook(),它用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程。
注意,设计自己的阻塞处理例程时,除了函数WSACancelBlockingHook()之外,不能使用其他的WinSock API函数。
在处理例程中调用WSACancelBlockingHook()函数将取消处于阻塞的操作并结束阻塞循环。
(23)Windows Sockets为了和多线程环境(如Windows NT)兼容,提供了两个出错处理函数WSAGetLastError()和WSASetLastError()来获取和设置当前线程的最近错误号。
(24)由于Windows Sockets的服务是以动态链接库Winsock.dll的形式实现的,因此必须先调用WSAStartup()函数对Windows Sockets DLL进行初始化,协商Windows Sockets版本支持,并分配必要的资源。
在应用程序中完成了对Windows Sockets的使用之后,还应调用函数WSACleanup()终止对Windows Sockets DLL的使用,并释放资源,以备下一次使用。
在这些函数中,实现Windows网络实时通信的关键是异步选择函数WSAAsyncSelect()的使用。
(25)WinSock的启动是通过调用WSAStartup函数,实现Windows Sockets DLL的初始化,协商WinSock的版本支持,并分配必要的资源。
如果在调用WinSock函数之前,没有加载WinSock库,则返回SOCKET_ERROR错误,错误信息是WSANOTINITIALISED。
(26)请绘制数据报套接字编程时序图。
(27)请绘制流式套接字编程时序图。
服务器方客户机方
服务器方
流式套接字编程时序图
(28)Windows 套接字在两种模式下执行I/O 操作:阻塞和非阻塞。
(29)Winsock 提供了不同套接字I/O模型操作进行管理,常见的WinsockI/O模型有Select模型、WSAAsyncSelect模型、WSAEventSelect模型。
(30)Select函数中
int WSAAPI select(int nfds,
fd_set FAR *readfds,
fd_set FAR *writefds,
fd_set FAR *exceptfds,
const struct timeval FAR *timeout );
参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据;参数writefds 指向要做写检测的套接字描述符集合的指针;参数exceptfds指向要检测是否出错的套接字描述符集合的指针;
(31)WinSock提供了4个宏对fd_set结构进行操作,分别是:* FD_CLR(s, *set):从集合set中删除描述字s。
* FD_ISSET(s, *set):若s为集合中一员,则非零,否则为零。
* FD_SET(s, *set):向集合添加描述字。
* FD_ZERO(s, *set):将set初始化为空集NULL。
(32)WSAAsyncSelect模型是WinSock中另一个常用的异步I/O模型。
利用这个模型可在一个套
接字上接收以Windows消息为基础的网络事件通知。
(33)若无错误发生,WSAEnumProtocols()返回协议的数目,否则返回INV ALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
(34)WinSock 2引入了重叠I/O的概念并且要求所有的传输协议提供者都支持这一功能。
它的基本原理是让应用程序使用一个重叠的数据结构,一次投递一个或多个WinSock I/O请求,针对那些提交的请求,在它们完成之后,应用程序可为它们提供服务。
应用程序可通过ReadFile和WriteFile两个函数执行I/O操作。
(35)当应用程序使用setsockopt函数把接收缓冲区长度设置为0时,对可靠传输协议,数据直到应用程序提供了接收缓冲区后才被接收,而对不可靠传输协议,数据将会丢失。
(36)WinSock 2中QoS的使用模型如下:(1) 对基于连接的传输服务,应用程序可以很方便地在使用WSAConnect函数提出连接请求时规定它所要求的服务质量(QoS)。
(2) 无连接的套接字也可以使用WSAConnect函数为一个指定的通信规定特定的QoS级别,WSAIoctl函数也可用来规定初始的QoS要求,或者用于今后的QoS协商。
(37)套接字具有很多套接字选项,这些选项代表套接字在不同需要下的行为,通过setsockopt函数和getsockopt函数可以灵活地设置和获取某个套接字的行为方式。
(38)调用setsockopt和getsockopt函数时,最常见的错误是试图获得一个套接字的信息,但那个套接字的基层协议却不具备某种指定的特性(或选项)。
第3章基本网络应用
(1)函数int gethostname(char *name, int namelen);参数name是一个指向将要存放主机名的缓冲区指针。
namelen用于指定缓冲区的长度。
该函数把本地主机名存入由name参数指定的缓冲区中,返回的主机名是一个以NULL结束的字符串。
主机名的形式取决于WinSock实现,它可能是一个简单的主机名,或者是一个域名。
然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。
如果没有错误发生,gethostname()返回0;否则它返回SOCKET_ERROR。
(2)函数struct hostent *gethostbyname(const char *name);中name为指向主机名的指针,它一般由函数gethostname返回。
函数返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针,该结构格式如下:
struct hostent
{
char FAR* h_name;
char FAR FAR** h_aliases;
short h_addrtype;
short h_length;
char FAR FAR** h_addr_list;
};
其中:字段h_name为正规的主机名;字段h_aliases是一个以空指针结尾的可选主机名队列;字段h_addrtype返回地址的类型,对WinSock这个域总是AF_INET;字段h_length为每个地址的长度(字节数),对应于AF_INET这个域应该为4;字段h_addr_list为以空指针结尾的主机地址的列表,返回的地址是以网络顺序排列的。
(3)函数GetAdaptersInfo可以获得本地计算机的网络信息,从而获得该计算机的网卡名、网卡驱动程序、IP地址、子网掩码、物理地址、是否启用了DHCP、是否启用了WINS等网络信息。
注意该函数在头文件IpHlpApi.h中声明,库文件为IpHlpApi.lib。
(4)函数DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen);其中:
参数pAdapterInfo指向IP_ADAPTER_INFO结构链表缓冲区的指针;
参数pOutBufLen指向一个ULONG变量的指针,该ULONG变量表示指向pAdapterInfo结构的大小。
参数中的IP_ADAPTER_INFO结构包含了本地计算机上一个特定网络适配卡的信息。
(5)针对指定的工作站上安装哪种协议和各种协议特性的返回问题,WinSock 2提供了一种解决方法。
如果一个协议支持多种行为,则每类行为在系统中都有各自的目录条目。
比如,如果在自己的系统中安装了TCP/IP,系统中就会有两个IP条目:一个条目针对TCP,是可靠的面向连接的,另一个针对IP,是不可靠且无连接的。
(6)要想获得系统中安装的网络协议的相关信息,可调用WSAENumProtocols函数,其原型为:int WSAENumProtocols(LPINT lpiProtocols, LPWSAPROTOCOL_INFO lpProtocolBuffer,
LPDWORD lpdwBufferLength);
其中:
参数lpiProtocols是一个以NULL结尾的协议标识号数组,该参数可选,如果lpiProtocols为NULL,则返回所有可用协议的信息,否则返回数组中所列的协议信息;
参数lpProtocolBuffer是一个用PROTOCOL_INFO结构填充的缓冲区,该结构用来存取和获得给定协议的完整信息;
参数lpdwBufferLength在输入时,用于保存传递给WSAENumProtocols()函数的lpProtocolBuffer 缓冲区长度;在输出时,存有获取所有请求信息需传递给WSAENumProtocols()函数的最小缓冲区长度。
若无错误发生,WSAENumProtocols函数返回协议的数目,否则,返回INV ALID_SOCKET错误,应用程序可通过WSAGetLastError()函数来获取相应的错误代码。
(7)通常需要两次调用WSAENumProtocols函数以获取特定的协议信息,第一次调用时指定lpProtocolBuffer为NULL,调用失败,返回WSAENOBUFS错误,但参数lpdwBufferLength包含了所有协议信息需要的缓冲区长度。
分配了恰当的缓冲区长度后,便可利用这个缓冲区进行第二次调用,协议的信息将包含在WSAPROTOCOL_INFO结构中。
这样就可以对该结构进行分析从而获得所需要的协议信息。
(8)应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:
SOCKET PASCAL FAR socket(int af, int type,int protocol);
该调用要接收三个参数:af.type,protocol。
参数af指定通信发生的区域,DOS和Windows 仅支持AF_INET,它是网际网区域,因此,地址族与协议族相同。
参数type描述要建立的套接字的类型。
参数protocol说明该套接字使用的特定协议.如果调用者不希望持别指定使用的协议,则置为o,使用默认的连接模式。
根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。
因此,socket()系统调用实际上指定了相关五元组中的“协议”这一元。
(9)bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来.即将名字赋予套接字,以指定本地半相关。
(10)int PASCAL FAR bind(SOCKBT s,const struct sockaddr FAR *name,int namelen);
参数s是由socket()调用返回的并且末作连接的套接字描述符(套接字号)。
参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。
namelen表明了name的长度。
如果没有错误发生,bind()返回o;否则返回值SOCKETERROR。
(11)socket() bind() connect() listen() accept()这五个套接字系统调用,可以完成一个完全五元相关的建立。
(12)Windows Sockets的套接字函数包括sockets()bind()getpeername() getsockname()和closesocket()。
它们主要完成创建、关闭套接字功能以及对套接字命名和名字获取。
网络连接函数,此类函数包括listen(),accept(),connect()和shutdown()。
它们完成网络连接(如虚电路)的建立与关闭。
此类函数中有部分可阻塞。
数据传输函数,此类函数包括send(),recv(),sendto()和recvfrom()。
它们完成网络数据的发送与接收,全部是可以阻塞的函数。
字节定序函数,此类函数包括htonl(),htons(),ntohl()和ntohs()。
它们完成主机和网络之间数据字节顺序的转换。
地址转换函数,此类函数包括inet_addr(),inet_ntoa(),它们完成网络字符串地址和Internet地址之间的转换。
套接字控制函数,此类函数包括getsockopt(),setsockopt(),ioctsocket()和select(),它们设置/获取套接字的选项,控制/检测套接字的工作状态。
其中se1ect()函数在必要时可能阻塞。
(13)在非抢先windows环境,强烈推荐程序员使用非阻塞(异步)操作,也就是说,推荐使用windows Sockets提供的异步选择函数代替可能阻塞的selct()函数,并且用网络事件消息来驱动可能阻塞的网络连接函数(accept()和connect())和数据传输函数,这样设计的程序能更好地工作。
程序设计练习
1.编写一个简单的基于流式套接字的FTP程序,客户机可以向服务器传输简单的文本文件,给出主要实现代码。
2.使用UDP套接字完成如下服务器和客户机的编程工作:客户机发送一个整数,UDP循环服务器将这个整数加上10000,结果返回给客户机。
3.编写基于TCP的C/S程序,服务器和客户端程序的基本流程是怎样的?给出主要实现代码。