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

  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_LEN

struct 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;//后面还有对用户透明的接口,足够大!
};
新的通用套接字能够容纳下系统支持的任何套接字地址结构。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值