unix网络编程第一卷——chapter 3
来源:互联网 发布:淘宝开店卖游戏币 编辑:程序博客网 时间:2024/05/30 04:32
本章的内容:套接字结构,字节排序函数,字节操作函数,地址转换函数
网络编程中的各种套接字联网API的操作对象都是套接字结构。
这些结构可以在两个方向上传播,从进程到内核,从内核到进程。
特别注意的是:从内核到进程方向的传递是值--结果参数的一个例子,即传递变量地址。比如套接字结构大小这个参数,有时候传递大小这个值,有时候传递存储这个值的指针。这是因为:当函数调用时,结构大小是一个值,告诉内核该结构的大小,这样内核在写该结构时,就不会越界;同时函数返回时,结构大小又是一个结果,内核告诉进程内核在该结构中到底存储了多少信息。当然,对于套接字地址结构是固定长度的,那么从内核返回的结果与传递的值是一样的。例如sockaddr_in的大小是16.然而对于可变长度的套接字地址结构(例如unix域的),那么返回值就可能小于该结构的最长长度。同时,我们也就明白了,为什么需要设置一个长度字段,因为有的套接字地址结构的长度是不确定的,事先需要先分配足够大小的空间,内核完成该结构后,才确定真是的长度。当然,我们在其他函数也可以碰到值--结果参数的例子,例如select,getsockopt等等(总之,socket联网API大量使用了值--结构参数)。
总之值--结果参数的作用是:函数调用时先使用,调用完成时,作为一个结果返回。很明显这个参数是一个指针或者引用。
套接字地址结构:
对该结构肯定存在很多疑惑:
疑惑1:就是为什么struct in_addr 里面只有一个成员,却还是一个结构体,显得多此一举,这是历史原因造成的,历史上ipv4存在a/b/c三类地址,随着子网技术的发张,这种概念就消失了,那个时候问了方便访问ip地址某个字节,设计了一种联合体。后来就干脆取消了其他两种结构,留下一个网络字节序的32位无符号数。从两种第一可以看出来,后来的设计兼容了原始设计,无论系统使用哪种就够,访问sin_addr.s_addr都可以得到ip地址的32位无符号数。
struct
in_addr
{
union
{
struct
{
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
//An IPv4 address formatted as four u_chars.
struct
{
u_short s_w1,s_w2;
} S_un_w;
//An IPv4 address formatted as two u_shorts
u_long S_addr;
//An IPv4 address formatted as a u_long
} S_un;
#define s_addr S_un.S_addr
};
字节排序函数
另外:对于大于一个字节的成员采用的是网络字节序存储(大端字节序)。为什么要规定一个网络字节序呢。,考虑一个32位整数,由4个字节组成,那么他们就存在一个存储顺序的问题:到底是在
存储该值的起始地址存储低序字节还是高序字节。这没有统一的标准。不同的系统采用不同的顺序。我们称:在低地址存储低序字节为小端字节序,在低地址存储高序字节为大端存储,采用不同字节序的系统之间传输多字节数据会发生对同一个数据做不同的解释。所以网络协议必须指定一个网络字节序,即为大端字节序,所以主机传送数据时需要进行字节顺序准换。
这里有几个函数需要记住:htonl(); ntohl(); htons();ntohs(); 注意:h:host, n:network, l表示long int ,s short。但是不同的机器,不同的编译器对long,short的理解不一样,这里long表示32位bit,short表示16位bit。
地址转换函数
- unix网络编程第一卷——chapter 3
- Unix网络编程(卷1)—笔记
- 《UNIX网络编程 第一卷》第一个例子
- 《UNIX网络编程(卷一)》第一至六章学习笔记
- unix网络编程第一卷代码初使用【转】
- 读书笔记之《UNIX网络编程 第一卷》第三章
- 《UNIX网络编程卷1》第一例及问题
- Unix 网络编程卷1
- Unix网络编程第一卷(第三版) 第一个程序运行成功
- 再读Socket编程——《UNIX网络编程(卷一)》学习点滴
- Unix网络编程卷一(笔记3)
- Unix网络编程 第一卷 套接口API 第五章 TCP客户/服务器程序例子
- 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决
- unix网络编程第一卷学习之套接字地址结构
- 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决
- 《Unix网络编程卷1-套接字联网API》第一个例子编译
- Unix网络编程(卷一)-第一个简单的时间获取程序
- 《UNIX网络编程 卷一:套接字联网API》第一至六章学习笔记
- xml转义符号
- 【fragment】Android Fragment 基本介绍
- ps 加深减淡算法
- 自动管道过滤器结构组成与应用领域介绍
- 最期dos和word源码下载
- unix网络编程第一卷——chapter 3
- java.lang.NoClassDefFoundError: org/hibernate/service/jta/platform/spi/JtaPlatform
- 简单说明cocos2d的触摸事件中如何确定选中对象
- hdu2072(string的应用)
- NYOJ_268荷兰国旗问题
- [转]解决Tomcat catalina.out 不断成长导致档案过大的问题
- java 浮点数格式处理DecimalFormat用法
- Git 库的创建以及使用
- 项目中的简单shader