UNIX网络编程读书笔记:套接口地址结构
前言
大多数套接口函数都需要一个指向套接口地址结构的指针作为参数。每个协议族都定义它自己的套接口地址结构。这些结构的名字均以“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。
IPv4套接口地址结构
IPv4套接口地址结构通常也称为”网际套接口地址结构“,它以”sockaddr_in“命名,定义在头文件<netinet/in.h>中。其POSIX定义如下:
/* sockaddr_in */ struct in_addr {
in_addr_t s_addr; /* 23 bits IPv4 address */
}; /* network byte ordered */ struct sockaddr_in {
uint8_t sin_len; /* length of structure(16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16-bit TCP or UDP port number */
/* network byte ordered */
struct in_addr sin_addr; /* 32-bit IPv4 address */
/* network byte ordered */
char sin_zero[8]; /* unused */
};
说明:
(1)除非涉及到路由套接口,否则对于长度成员sin_len,我们无需设置,也无需检查。
(2)IPv4地址和TCP或UDP端口号在套接口地址结构中总是以网络字节序来存储,我们在使用这些成员时,必须牢记这一点。
(3)可以有两种不同的方法来访问32位IPv4地址。例如如果serv定义为网际套接口地址结构,那么serv.sin_addr给出的32位IPv4地址将是一个in_addr结构,而serv.sin_addr.s_addr给出的32位IPv4地址则是一个in_addr_t(通常是无符号的32位整数)。
(4)sin_zero成员暂不使用,但总是将它设置为0. 为方便起见,在初始化结构时,我们一般是将整个结构设置为0,而不仅仅是设置sin_zero成员为0. 虽然多数结构的使用不要求这一成员为0,但当捆绑一个非通配IPv4地址时,此成员必须为0.
(5)套接口地址结构仅在给定主机上使用:虽然结构中的某些成员(如IP地址和端口号)用在不同主机间的通信中,但结构本身并不参与通信。
通用套接口地址结构
当作为参数传递给任一个套接口函数时,套接口地址结构总是通过指针来传递,但是,通过指针来取得此参数的套接口函数必须处理来自所支持的任何协议族的套接口地址结构。
有一个问题是如何声明所传指针的数据类型。ANSI C 中有很简单的解决办法:它有通用的指针类型void *。但是,套接口函数是在ANSI C 之前定义的。1982年采用了这一的一个办法:在<sys/socket.h>头文件中定义一个通用的套接口地址结构,如下:
/* sockaddr */ struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family; /* address family: AF_xxx value */
char sa_data[14]; /* protocol-specific address */
};
于是,套接口函数被定义为采用指向通用套接口地址结构的指针。这就要求对这些函数的任何调用都必须将指向特定于协议的套接口地址结构的指针类型转换成指向通用套接口地址结构的指针。
UNIX网络编程读书笔记:套接口地址结构的更多相关文章
- UNIX网络编程读书笔记:基本TCP套接口编程
编写一个完整的TCP客户和服务器程序所需要的基本套接口函数: 1.socket函数(客户端.服务器端都必须调用) 参数family指明协议族(family),该参数也往往被称为协议域(domain). ...
- UNIX网络编程读书笔记:基本SCTP套接口编程
概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...
- UNIX网络编程读书笔记:基本UDP套接口编程
概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...
- UNIX网络编程读书笔记:名字与地址转换
概述 在名字和数值地址间进行转换的函数: gethostbyname和gethostbyaddr:在主机名字与IPv4地址之间进行转换.仅仅支持IPv4. getservbyname和getservb ...
- UNIX网络编程读书笔记:UNIX域协议
概述 UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同.UNIX域协议可视为进程间通信 ...
- UNIX网络编程读书笔记:recvmsg和sendmsg函数
这两个函数是最通用的I/O函数.实际上我们可以把所有read.readv.recv和recvfrom调用替换成recvmsg调用.类似地,各种输出函数调用也可以替换成sendmsg调用. #inclu ...
- UNIX网络编程读书笔记:地址操纵函数
地址格式转换函数:它们在ASCII字符串(人们比较喜欢用的格式)与网络字节序的二进制值(此值存于套接口地址结构中)间转换地址. 1.inet_aton.inet_addr.inet_ntoa inet ...
- UNIX网络编程--读书笔记
会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...
- UNIX网络编程读书笔记:简介
认知套接口编程接口 理解原始套接口(raw socket)的概念 值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...
随机推荐
- VS2015常用配置
一.调用控制台: 在VS中使用opencv或者QT过程中,完成编程后, 运行发现没有控制台窗口, 比如我们用Qt编写的界面软件, 又想看到我们在代码中添加的打印日志信息,这个时候加上控制台窗口就能实现 ...
- luogu P1011 车站
题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...
- 我的OI生涯番外篇
番外篇 转眼间我学oi已经一年了,可回头想想这一年来的收获也没有什么,大部分时间都荒废掉了. 下半年开学后,学物竞的王洋转来了我们电竞,虽然他之前是我的同班同学但也没怎么交流过. 这下我们又成为了oi ...
- Nginx 502 Bad Gateway 解决方法
proxy_next_upstream error timeout invalid_header http_500 http_503;或者尝试设置:large_client_header_buffer ...
- bzoj 2724 在线区间众数
如果不是在线,就是裸的莫队. 但这道题要求在线,然后就不会了.. 标程: http://hi.baidu.com/__vani/item/ecc63f3527395283c2cf2945 算法主要是分 ...
- 思科DCHP解决方案
DHCP功能平时用的不算少,而且本人的几乎所有的DHCP功能都是在交换机上实现的,虽然也可以通过PC实现,而且PC的DHCP Server功能还更完善,比如可以不受DHCP作用域的限制.IP分配情况直 ...
- What is the Linux High Availabi
What is the Linux High Availabi 简介: 高可用性群集的出现是为了使群集的整体服务尽可能可用,以便考虑计算硬件和软件的易错性.如果高可用性群集中的主节点发生 ...
- HTML5 Plus移动App(5+App)开发入门指南
HTML5 Plus移动App,简称5+App,是一种基于HTML.JS.CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实现与原生App同样强大的功能和 ...
- WinDbg-如何抓取dump文件
这要分两种情况:第一种情况:如果是Vista或者是Windows2008操作系统就是一个简单的事情,在任务管理器中,切换到"进程"选项卡,右键点击你想要创建dump文件的进程,然后 ...
- 我的sourceinsight的配置
下面是我的sourceinsight的配置,点击下面的链接,下载*.em文件,将他们添加到Base工程,设置相应的快捷键即可,或者导入下载的配置文件. http://pan.baidu.com/s/1 ...