三、初识Socket套接字结构体

一、初识Socket套接字结构体


1、通用套接字结构体类型

   struct sockaddr
    {
        sa_family_t sa_family; //协议簇
        char sa_data[14]; //协议簇数据
    }

通用套接字结构体可以在不同的协议簇之间进行强制转化,Socket网络编程中几乎所有套接字API函数的形参都是通用套接字结构体struct sockaddr。

存在问题:

  • 通用套接字结构体对编程的角度来说,设置很不方便,我们以以太网协议来说,当要设置端口号、IP地址等,那么我需要将端口号与IP地址进行数据组合绑定,然后赋值给该结构,是不能独立赋值。

  • 为解决上述问题,以太网协议中经常用到的是下述结构体,这样就可以给人以直观的方式去填充套接字结构体。

2、以太网套接字结构体

struct sockaddr_in
    {
        u8 sin_len;
        u8 sin_family;
        u16 sin_port;
        struct in_addr sin_addr;
        char sin_zero[8]; 
    }
  • 结构体成员列表
结构体成员参数含义备注
u8 sin_len结构体sockaddr_in的长度一般大小为固定16字节
u8 sin_family协议族类型见下表
u16 sin_port16位端口号XXX
struct in_addr sin_addr32位IP地址INADDR_ANY //表示可以与任何主机通信
char sin_zero[8]//未使用填充位,一般都设置为0

  • 协议簇列表

协议簇类型(sin_family)参数含义
AF_INET以太网/IPv4协议
AF_INET6以太网/IPv6协议
AF_LOCALUnix域协议/只在本机内通信的套接字
AF_ROUTE路由套接口
AF_KEY密钥套接口

Note : 我们主要使用的是以太网,所以sin_family成员一般都为AF_INET ,有时候我们看到协议簇类型是PF_* 而不是 AF*,这是因为glibc的实现机制是posix,其实都是同一个东西。


存在问题:

  • Socket网络编程中几乎所有套接字API函数的形参都是通用套接字结构体struct sockaddr,而我们初始化传递的参数是以太网套接字结构体struct sockaddr类型,这样是否就存在类型不一致的问题?
Exzampp:
  // API函数: fun(struct sockaddr)
 //  用户实际调用: 
 int main()
 {
     struct sockaddr_in;
     fun(sockaddr_in);    //是否存在问题?
 }
     

问题解答:

  • 上述操作完全可以,因为这两个结构体在内存上的大小完全一致都是16个字节,所以隐式的转换不存在其它问题。
  • struct sockaddr = struct sockaddr_in 。 (不存在问题)

1437274-20180714104702134-471387781.jpg

  *图示:两种结构类型的内存存储*

转载于:https://www.cnblogs.com/retry/p/9308802.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值