博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX网络编程读书笔记:套接口地址结构
阅读量:6206 次
发布时间:2019-06-21

本文共 1750 字,大约阅读时间需要 5 分钟。

前言

大多数套接口函数都需要一个指向套接口地址结构的指针作为参数。每个协议族都定义它自己的套接口地址结构。这些结构的名字均以“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 */};

于是,套接口函数被定义为采用指向通用套接口地址结构的指针。这就要求对这些函数的任何调用都必须将指向特定于协议的套接口地址结构的指针类型转换成指向通用套接口地址结构的指针。

转载地址:http://jxwja.baihongyu.com/

你可能感兴趣的文章
基于轻量型Web服务器Raspkate的RESTful API的实现
查看>>
POJ 2406 Power Strings KMP运用题解
查看>>
lintcode:Ugly Number I
查看>>
Java设计模式系列之适配器模式
查看>>
深入理解JavaScript系列(37):设计模式之享元模式
查看>>
使用top命令查看最消耗CPU和最消耗内存的进程
查看>>
如何获取Android系统中申请对象的信息
查看>>
jQuery图片延迟加载
查看>>
indent guides 格式化代码(添加竖线)
查看>>
Nodejs爬虫进阶教程之异步并发控制
查看>>
PHP数字补零的两种方法
查看>>
Windows 7个性化配置,关闭Win7动画效果,设置窗口背景为“ 豆绿色”,移动“我的文档”...
查看>>
ASP.NET MVC Bootstrap极速开发框架
查看>>
HDU 5810 Balls and Boxes 数学
查看>>
EditText监听键盘输入
查看>>
git 服务器搭建,在自己服务器上搭建私有仓库
查看>>
springmvc参数类型转换三种方式
查看>>
Android Weekly Notes Issue #220
查看>>
am335x sd卡启动开启识别emmc kernel 上的改动
查看>>
【Hadoop】Hadoop HA机制要点
查看>>