版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38215395/article/details/79537700
本文将介绍socket的概念、IPV4套接口地址结构、字节序、套接字类型以及常用的几个地址转换函数。
1、什么是socket?
socket可以看成是用户进程与内核网络协议栈的编程接口。它不仅可以用于本机间的进程间通信,还可以用于网络上不同主机间的进程间通信。socket在TCP/IP协议栈中的位置如下图所示。
2、IPV4套接字地址结构(网际套接字地址结构)
存放于<netinet/in.h>
中,以“sockaddr_in”命名。
struct sockaddr_in{
uint8_t sin_len; //结构体大小
sa_family_t sin_family; //指定该地址家族,IPV4为AF_INET
in_port_t sin_port; //端口号,无符号16位整数
struct in_addr sin_addr; //32位无符号地址
char sin_zero[8];
};
3、字节序
字节序分为大端字节序和小端字节序,其中大端字节序又称为网络字节序。两种子节序存储数据的方式如下:
比如,现有一个无符号32位整数0x12345678,存在两种存储方式:
我们常用的x86平台,是利用的小端字节序存储数据,Motorola 6800利用的是大端字节序存储数据。而ARM的字节序是可配置的。
当字节在传输过程中,比如A—>B,存在以下过程 :A—>网络字节序—>B机字节序—>B。
4、常用的地址转换函数
in_addr_t inet_addr(const char *cp)
:将点分十进制的ip地址转换成32位无符号整数;char *inet_ntoa(struct in_addr in)
:将一个地址结构转换成点分十进制的ip地址;int inet_aton(const char *cp,struct in_addr *inp)
:将点分十进制的ip地址转换成网络字节序地址(通过inp结构体输出)
5、套接字类型
主要有流式套接字、数据报式套接字以及原始套接字。
1. 流式套接字SOCK_STREAM(对应于TCP):提供面向连接的可靠的数据传输,即数据无差错、无重复、无失序的传输;
2. 数据报式套接字SOCK_DGRAM(对应于UDP):提供无连接服务,不保证可靠传输;
3. 原始套接字:可直接封装。