赞
踩
这个struct sockaddr_in 前三行有三个变量
- truct sockaddr_in
- {
- __SOCKADDR_COMMON (sin_);
- in_port_t sin_port; /* Port number. */
- struct in_addr sin_addr; /* Internet address. */
-
- /* Pad to size of `struct sockaddr'. */
- unsigned char sin_zero[sizeof (struct sockaddr) -
- __SOCKADDR_COMMON_SIZE -
- sizeof (in_port_t) -
- sizeof (struct in_addr)];
- };
-
- typedef uint16_t in_port_t;
-
-
发现 in_port_t是一个宏,侧面说明port是16位的。
- typedef uint32_t in_addr_t;
- struct in_addr
- {
- in_addr_t s_addr;
- };
in_addr_t 也是一个宏,说明ip是一个32位的
- #define __SOCKADDR_COMMON(sa_prefix) \
- 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
- #include <arpa/inet.h>
-
- uint16_t htons(uint16_t hostshort);
-
我们主机上的ip一般而言是 “127.0.0.1” 这种形式的,既是一个字符串类型的
然而根据源码所知,我们的ip是 一个32位(四字节)的整形
所以我们也要进行转化,
链接如下:
我们在网络通信过程中ip也要是网络序列的ip,也要进行转化(既就是将转化成整数ip的地址进行大端或者小端转化(按照网络协议))
接口如下
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
-
-
- in_addr_t inet_addr(const char *cp);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。