UNIX网络编程I-03

来源:互联网 发布:mysql查询性能分析器 编辑:程序博客网 时间:2024/06/03 18:13

大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。

 struct in_addr {

  in_addr_t s_addr;

 }

 

 struct sockaddr_in {

  uint8_t sin_len;

  sa_family_t sin_family;

  in_port_t sin_port;

  struct  in_addr sin_addr;

  char sin_zero[8];

 }

长度字段sin_len是为增加对OSI协义的支持而随4.3BSD添加的。在此之前, 第一个成员是sin_family, 它是一个无符号短整型。即使有长度字段,我们也无须, 设置和检查它, 除非涉及路由套接字。

 POSIX规范只需要这个结构中的3个字段:sin_family, sin_addr和sin_port。

 几平所有的实现都增加了sin_zero字段, 所以所有的套接字地址结构大小都至少是16字节。

 

 IPV4地址和TCP或UDP端口号在套接字地址结构中总是以网络字节序来存储。

 32位IPV4地址存在两种不同的访问。

 sin_addr字段是一个结构, 而不仅仅是一个in_addr_t类型的无符号长整型。早期的版本把in_addr结构定义为多种结构的联合(union), 允许访问一个32位IPV4地址中的所有4个字节, 或者访问它的2个16位值。那个联合已不再需要了。如今大多数系统已经废除了该联合, 转而把in_addr定义为仅有一个in_addr_t字段的结构。

 

 sin_zero字段未曾使用。尽管多数使用该结构的情况不要求这一字段为0, 但是当捆绑一个非通配的IPV4地址时, 该字段必须为0。


通用套接字地址结构(struct sockaddr)

 这些通用套接字地址结构的唯一用途就是对指向特定于协议的套接字地址结构的指针执行类型强制转换。


字节排序函数:

 内存中存储字节有两种方法:一种是小端, 低位低存, 一种是大端, 低位高存。

 例:0x1234

        小端: 34           12

        地址:1000       1001    1002 ....

        大端: 12           34

 我们把某个给定系统所用的字节序称为主机字节序。

 网络协议必须指定一个网络字节序, 而网络字节序为大端字存储方式, 主机字节序在不同的系统下不定。

 uint16_t htons(uint16_t hostbit);

 uint16_t ntohs(uint16_t netbit);

 uint32_t htonl(uint32_t hostbit);

 uint32_t ntohl(uint32_t netbit);


0 0