当前位置:   article > 正文

关于 struct sockaddr_in

关于 struct sockaddr_in

源码剖析

这个struct sockaddr_in 前三行有三个变量

  1. truct sockaddr_in
  2. {
  3. __SOCKADDR_COMMON (sin_);
  4. in_port_t sin_port; /* Port number. */
  5. struct in_addr sin_addr; /* Internet address. */
  6. /* Pad to size of `struct sockaddr'. */
  7. unsigned char sin_zero[sizeof (struct sockaddr) -
  8. __SOCKADDR_COMMON_SIZE -
  9. sizeof (in_port_t) -
  10. sizeof (struct in_addr)];
  11. };

sin_port

  1. typedef uint16_t in_port_t;

发现 in_port_t是一个宏,侧面说明port是16位的。

sin_addr

  1. typedef uint32_t in_addr_t;
  2. struct in_addr
  3. {
  4. in_addr_t s_addr;
  5. };

in_addr_t 也是一个宏,说明ip是一个32位的

sin_family

  1. #define __SOCKADDR_COMMON(sa_prefix) \
  2. sa_family_t sa_prefix##family

这个也是一个宏,看起来比较复杂,sa_prefix是前面struct sockaddr_in 里面传的_sin

## 可以将两个字符串连接

既就是 sa_family_t sin_family

而这个sa_family_t是什么呢??

typedef unsigned short int sa_family_t;

源码表示的是无符号的短整形,

所以这个变量既就是 一个短整型的变量。

深入理解:

两个主机间进行数据交互,必要的条件包括发送的和接受端的端口号要两个主机已知

这样才可以进行主机间数据交互。(同理ip也可是

所以报文中必须要携带自己的ip,端口号,还要携带目的ip,目的端口号

port

我们自己的电脑端的端口号在存储时,可能是大端存储,也可能是小端存储,但是他们两个之间要交互时,必须要经过网络。

网络中的协议规定端口号主机中的端口号存储方式若是不一样的,就需要将主机序列的port转化成为网络序列的port

接口如下

  1. #include <arpa/inet.h>
  2. uint16_t htons(uint16_t hostshort);

ip

我们主机上的ip一般而言是   “127.0.0.1” 这种形式的,既是一个字符串类型的

然而根据源码所知,我们的ip是 一个32位(四字节)的整形

所以我们也要进行转化,

链接如下:

https://blog.csdn.net/weixin_73964834/article/details/138923577?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22138923577%22%2C%22source%22%3A%22weixin_73964834%22%7D

我们在网络通信过程中ip也要是网络序列的ip,也要进行转化(既就是将转化成整数ip的地址进行大端或者小端转化(按照网络协议)

接口如下

  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <arpa/inet.h>
  4. in_addr_t inet_addr(const char *cp);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/616482
推荐阅读
相关标签
  

闽ICP备14008679号