UNIX网络编程读书笔记:UNIX域协议

概述UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同。UNIX域协议可视为进程间通信(IPC)方法之一。UNIX域提供两类套接口:字节流套接口(类似TCP)和数据报套接口(类似UDP)。使用UNIX域套接口的理由有3个:在源自Berkeley的实现中,UNIX域套接口往往比通信两端位于同一主机的TCP套接口快出一倍。UNIX域套接口可用于在同一个主机上的不同进程间传递描述字。UNIX域套接口较新的实现把客户的凭证(用户ID和组ID)提供给服务器,从而能够提供额外的安全检查措施。UNIX域中用于标识客户和服务器的协议地址是普通文件系统中的路径名。这些路径名不是普通的UNIX文件:除非把它们和UNIX域套接口关联起来,否则无法读写这些文件。UNIX域套接口地址结构在头文件<sys/un.h>中定义了UNIX域套接口地址结构:structsockaddr_un{sa_family_tsun_family;/*AF_LOCAL*/charsun_path[104];/*...

UNIX网络编程读书笔记:名字与地址转换

概述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr:在主机名字与IPv4地址之间进行转换。仅仅支持IPv4.getservbyname和getservbyport:在服务名字和端口号之间进行转换。getaddrinfo和getnameinfo:用于主机名字和IP地址之间以及服务名字和端口号之间的转换。(这两个函数是协议无关的)域名系统域名系统(DomainNameSystem,简称DNS)主要用于主机名字和IP地址之间的映射。资源记录DNS中的条目称为资源记录(resourcerecord,简称RR)。RR类型:A         A记录把一个主机名映射成一个32位的IPv4地址。AAAA   AAAA记录把一个主机名映射成一个128位的IPv6地址。PTR     称为“指针记录(pointerrecord)”,它把IP地址映射成主机名。解析器和名字服务器每个组织机构往往运行...

UNIX网络编程读书笔记:基本SCTP套接口编程

概述SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的)。它最初是为满足不断增长的IP电话市场设计的;具体地说,就是穿越因特网传输电话信令。SCTP是一个可靠的面向消息的协议,在端点之间提供多个流,并为多宿提供传输级支持。尽管SCTP和TCP之间存在一些本质性的差别,然而SCTP的一到一(one-to-one)接口与TCP提供的应用接口非常接近。这一点允许轻而易举地移植应用程序,不过没法使用SCTP的某些高级特性。SCTP的一到多(one-to-many)接口提供了这些特性的完全支持,然而可能需要费时费力地重新编写已有的应用程序。对于使用SCTP开发的大多数新的应用程序而言,推荐使用一到多接口。接口模型SCTP套接口分为两类:一到一套接口和一到多套接口。一到一套接口相应于单独一个SCTP关联。这种映射类似于TCP套接口和TCP连接的对应关系。对于一到多套接口,一个给定套接口上可以同时有多个活跃的SCTP关联。这种映射类似于绑定了某个特定端口的UDP套接口能够从若干个同时在发送数据的远地UDP端点接收彼此交错的数据报。一到一形式开发一到一形式的目...

UNIX网络编程读书笔记基本UDP套接口编程

概述使用UDP编写的一些流行的应用程序有:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)。如下图所示,给出了典型的UDP客户/服务器程序的函数调用:客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须作为参数指定目的地(即服务器)的地址。类似地,服务器不接受来自客户的连接,而是只管调用recvfrom函数,等待来自某个客户的数据到达。recvfrom将与所接收的数据报一道返回客户的协议地址,因此服务器可以把响应发送给正确的客户。recvfrom和sendto函数#include<sys/socket.h>ssize_trecvfrom(intsockfd,void*buff,size_tnbytes,intflags,structsockaddr*from,socklen_t*addrlen);ssize_tsendto(intsockfd,constvoid*buff,size_tnbytes,intflags,conststructsockaddr*to,socklen_taddrlen);两者均返回:读写字节数——...

UNIX网络编程读书笔记:套接口选项

概述有很多方法来获取和设置影响套接口的选项:getsockopt和setsockopt函数fcntl函数ioctl函数getsockopt和setsockopt函数这两个函数仅用于套接口。#include<sys/socket.h>intgetsockopt(intsockfd,intlevel,intoptname,void*optval,socklen_t*optlen);intsetsockopt(intsockfd,intlevel,intoptname,constvoid*optval,socklen_t*optlen);返回值:0——成功,-1——出错其中,sockfd必须指向一个打开的套接口描述字;level(级别)指定系统中解释选项的代码:或为通用套接口代码,或为某个特定于协议的代码(例如IPv4、IPv6、TCP或SCTP)。optval是一个指向变量(*optval)的指针,setsockopt从*optval中取得选项待设置的新值,getsockopt则把已获取的选项当前值存放到*optval中。optlen指定*optval的大小,它对于setsoc...

UNIX网络编程读书笔记:poll函数

poll函数提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息。poll函数原型#include<poll.h>intpoll(structpollfd*fdarray,unsignedlongnfds,inttimeout);返回:就绪描述字的个数,0——超时,-1——出错poll函数参数介绍第一个参数是指向一个结构数组第一个元素的指针。每个数组元素都是一个pollfd结构,用于指定测试某个给定描述字fd的条件。structpollfd{intfd;/*descriptortocheck*/shortevents;/*eventsofinterestonfd*/shortrevents;/*eventsthatoccurredonfd*/};要测试的条件由events成员指定,函数在相应的revents成员中返回该描述字的状态。(每个描述字都有两个变量:一个为调用值,另一个为返回结果,从而避免使用值-结果参数。)这两个成员中的每一个都由指定某个特定条件的一位或多位组合而成。下图列出了用于指定events标志以及测试revents标志的一些常值。我们将该...

UNIX网络编程读书笔记:pselect函数

函数原型pselect函数是由POSIX发明的,其原型如下:#include<sys/select.h>#include<signal.h>#include<time.h>intpselect(intmaxfdpl,fd_set*readset,fd_set*writeset,fd_set*exceptset,conststructtimespec*timeout,constsigset_t*sigmask);返回值:就绪描述字的个数,0——超时,-1——出错pselect相对于select的两个变化(1)pselect使用timespec结构,而不使用timeval结构。timespec结构是POSIX的有一个发明。structtimespec{time_ttv_sec;/*seconds*/longtv_nsec;/*nanoseconds*/};这两个结构的区别在于第二个成员:新结构的该成员tv_nsec指定纳秒数,而旧结构的该成员tv_usec指定微秒数。(2)pselect函数增加了第六个参数:一个指向信号掩码的指针。...

UNIX网络编程读书笔记:shutdown函数

终止网络连接的通常方法是调用close函数。不过close有两个限制,却可以使用shutdown来避免。close把描述字的引用计数减1,仅在该计数变为0时才关闭套接口。使用shutdown可以不管引用计数就激发TCP的正常连接终止序列(由FIN开始的四个分节).close终止数据传送的两个方向:读和写。既然TCP连接是全双工的,有时候我们需要告知对端我们已经完成了数据发送,即使对端仍有数据要发送给我们。下图展示了这样的情况下典型的函数调用。#include<sys/socket.h>intshutdown(intsockfd,inthowto);返回:0——成功,-1——出错该函数的行为依赖于howto参数的值:SHUT_RD关闭连接的读这一半——套接口中不再有数据可接收,而且套接口接收缓冲区中的现有数据都被丢弃。进程不能再对这样的套接口调用任何读函数。对一个TCP套接口这样调用shutdown函数后,由该套接口接收的来自对端的任何数据都被确认,然后悄然丢弃。SHUT_WR关闭连接的写这一半——对于TCP套接口,这称为半关闭(half-close)。当前留在套接口发送缓冲...

UNIX网络编程读书笔记:select函数

select函数概况:select函数允许进程指示内核等待多个事件中的任何一个发生,并仅在有一个或多个事件发生或经历一段指定的时间后才唤醒它。作为一个例子,我们可以调用select,告知内核仅在下列情况发生时才返回:(1)集合{1,4,5}中的任何描述字准备好读,或(2)集合{2,7}中的任何描述字准备好写,或(3)集合{1,4}中的任何描述字有异常条件待处理,或(4)已经历了10.2秒。也就是说,我们调用select告知内核对哪些描述字(就读、写或异常条件)感兴趣以及等待多长时间。我们感兴趣的描述字不局限于套接口;任何描述字都可以使用select来测试。#include<sys/select.h>#include<sys/time.h>intselect(intmaxfdpl,fd_set*readset,fd_set*writeset,fd_set*exceptset,conststructtimeval*timeout);返回值:就绪描述字的总数目,0——超时,-1——出错select函数参数介绍:关于此函数的参数的详细介绍可参考http://www.cn...

UNIX网络编程读书笔记:I/O模型(阻塞、非阻塞、I/O复用、信号驱动、异步)

I/O模型UNIX下可用的5种I/O模型:(1)阻塞I/O(2)非阻塞I/O(3)I/O复用(select和poll)(4)信号驱动I/O(SIGIO)(5)异步I/O对于一个套接口上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被拷贝到内核中的某个缓冲区。第二步就是把数据从内核缓冲区拷贝到应用进程缓冲区。1、阻塞I/O模型最流行的I/O模型是阻塞I/O(blockingI/O)模型。缺省情况下,所有套接口都是阻塞的。以数据报套接口作为例子,我们有下图所示的情形:进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回。最常见的错误是系统调用被信号中断。我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据。2、非阻塞I/O模型进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。下图展示了非阻塞I/O模型。前三次调用recvfrom时没有数据可返回,因此内核转而立即返回一个EWO...

UNIX网络编程读书笔记:基本TCP套接口编程

 1、socket函数(客户端、服务器端都必须调用)参数family指明协议族(family),该参数也往往被称为协议域(domain)。所以有的书上声明如下:而且对于socket函数第一个参数,在不同书籍上可能会看到不同前缀的取值常量列表,如下两图所示:AF_xxx与PF_xxx:AF_前缀表地址族,PF_前缀表示协议族。历史上曾有这样的想法:单个协议族可以支持多个地址族,PF_值用来创建套接口,而AF_值用于套接口地址结构。但实际上,支持多个地址族的协议族从来就未实现过,而且头文件<sys/socket.h>中为一给定协议定义的PF_值总是与此协议的AF_值相等。2、connect函数(TCP客户端调用)客户在调用函数connect前不必非得调用bind函数,因为如果需要的话,内核会确定源IP地址,并选择一个临时端口作为源端口。如果是TCP套接口,调用connect函数将激发TCP的三路握手过程,而且仅在连接建立成功或出错时才返回,其中出错返回可能有以下几种情况:(1)若TCP客户没有收到SYN分节的响应,则返回ETIMEDOUT错误。(2)若对客户的SYN的...

UNIX网络编程读书笔记:地址操纵函数

地址格式转换函数:它们在ASCII字符串(人们比较喜欢用的格式)与网络字节序的二进制值(此值存于套接口地址结构中)间转换地址。1、inet_aton、inet_addr、inet_ntoainet_aton、inet_addr和inet_ntoa在点分十进制数串(例如,”206.168.112.96“)与它的32位网络字节序二进制值间转换IPv4地址。#include<arpa/inet.h>intinet_aton(constchar*strptr,structin_addr*addrptr);返回:1——串有效,0——串有错int_addr_tinet_addr(constchar*strptr);返回:若成功,返回32位二进制网络字节序地址;若有错,则返回INADDR_NONEchar*inet_ntoa(structin_addrinaddr);返回:指向点分十进制数串的指针inet_aton将strptr所指的C字符串转换成32位网络字节序二进制值,并通过指针addrptr来存储。如果成功返回1,否则返回0.inet_addr进行与inet_aton相同的转换,返...

UNIX网络编程读书笔记:字节操纵函数

#include<strings.h>voidbzero(void*dest,size_tnbytes);voidbcopy(constvoid*src,void*dest,size_tnbytes);intbcmp(constvoid*ptr1,constvoid*ptr2,size_tnbytes);返回:0-相等,非0-不相等bzero将目标中指定数目的字节置为0;bcopy将指定数目的字节从源移到目标;bcmp比较任意两个字节串,若相同则返回值为0,否则返回值为非0.#include<string.h>void*memset(void*dest,intc,size_tlen);void*memcpy(void*dest,constvoid*src,size_tnbytes);intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnbytes);返回:0-相同,>0或<0-不相同memset将目标中指定数目的字节置为值c;memcpy与bcopy类似,但交换了两个指针参数的顺序,源与目标重叠时,bcopy能...

UNIX网络编程学习笔记:值-结果(value-result)参数

前言当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针。结构的长度也作为参数来传递,其传递的方式取决于结构的传递方向:从进程到内核,还是从内核到进程。1、从进程到内核从进程到内核传递套接口地址结构的函数有3个:bind、connect和sendto,这3个函数的一个参数是指向套接口地址结构的指针,另一个参数是结构的整数大小,例如:/*example*/structsockaddr_inserv;/*fillinserv{}*/connect(sockfd,(structsockaddr*)&serv,sizeof(serv));由于指针和指针所指结构的大小都传递给内核,所以从进程到内核要确切拷贝多少数据是知道的,如下图所示:2、从内核到进程从内核到进程传递套接口地址结构的有4个函数:accept、recvfrom、getsockname和getpeername。这4个函数的两个参数是:指向套接口地址结构的指针和指向表示结构大小的整数的指针,例如:/*example*/structsockaddr_uncli;/*Unixdomain*/so...

UNIX网络编程读书笔记:套接口地址结构

前言大多数套接口函数都需要一个指向套接口地址结构的指针作为参数。每个协议族都定义它自己的套接口地址结构。这些结构的名字均以“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。IPv4套接口地址结构IPv4套接口地址结构通常也称为”网际套接口地址结构“,它以”sockaddr_in“命名,定义在头文件<netinet/in.h>中。其POSIX定义如下:/*sockaddr_in*/structin_addr{in_addr_ts_addr;/*23bitsIPv4address*/};/*networkbyteordered*/structsockaddr_in{uint8_tsin_len;/*lengthofstructure(16)*/sa_family_tsin_family;/*AF_INET*/in_port_tsin_port;/*16-bitTCPorUDPportnumber*//*networkbyteordered*/structin_addrsin_addr;/*32-bitIPv4address*//*networkbyteordered...
首页上一页...34567...下一页尾页