套接字地址结构笔记----C++网络编程

来源:互联网 发布:什么打字软件好用 编辑:程序博客网 时间:2024/06/08 06:03

  1.IPv4套接字地址结构:

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];}
(1)sin_len是为了增加对OSI协议的支持随着4.3BSD-Reno添加的。

(2)其他几个都是平常网络编程最频繁看到的数据结构。

(3)sin_zero[8]字段几乎不曾用过,我们总是把这个设置为0,但是一般不是直接设置为0,而是先将整个结构全部置零在填写其他的。

就像在之前的一个简单服务器中的那串代码:

bzero(&servaddr,sizeof(servaddr));
这行代码也看到了,servaddr传参数的时候都是pass by reference!!!!!

  2.通用套接字地址结构

(1)为什么要有这个?因为传递套接字函数的是by reference,所以指针的类型是个很重要的问题。所以前人的解决方式:

在<sys/socket.h>头文件中定义一个通用的套接字地址结构:

struct sockaddr{    uint8_t sa_len;    sa_family_t sa_family;    char sa_data[14];};
(2)于是套接字函数被定义为以某个通用套接字地址结构的一个指针作为参数之一

bind(int , struct sockaddr * ,socklen_t);
这里发生了一个类型强制从转换:

struct sockaddr_in serv;bind(sockfd,(struct sockaddr*) &serv,sizeof(serv));
  3.IPv6套接字地址结构

struct in6_addr{    unit8_t s6_addr[16];};#define SIN6_LENstruct sockaddr_in6{    uint8_t sin6_len;    sa_family_t sin6_family;    in_port_t sin6_port;    uint32_t sin6_flowinfo;  //32位流标    struct in6_addr sin6_addr;  //128位IPv6地址    uint32_t sin6_scope_id;};
  4.新的通用套接字地址结构

在<netinet/in.h>

struct sockaddr_storage{    uint8_t ss_len;    sa_family_t ss_family;//后面还有对用户透明的接口,足够大!};
新的通用套接字能够容纳下系统支持的任何套接字地址结构。









阅读全文
0 0
原创粉丝点击