# 概述

# TCP/IP协议

叫做传输控制/网际协议,又叫网络通信协议。实际上,它包含上百个功能的协议,如ICMP(互联网控制信息协议)、FTP(文件传输协议)、UDP(用户数据包协议)、ARP(地址解析协议)等。TCP负责发现传输的问题,一旦有问题就会发出重传信号,直到所有数据安全正确的传输到目的地。

# socket

在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。socket其实是一种特殊的IO接口,也是一种文件描述符。

套接字由三个参数构成:IP地址,端口号,传输层协议。这三个参数用以区分不同应用程序进程间的网络通信与连接。

# 常用数据类型

# sockaddr

定义在

#include <sys/socket.h>

数据结构体为

struct sockaddr {
    //地址族,2字节
    unsigned short sa_family;
    //存放地址和端口,14字节
    char sa_data[14];
}

在 macos 中的定义

struct sockaddr {
	__uint8_t       sa_len;         /* total length */
	sa_family_t     sa_family;      /* [XSI] address family */
	char            sa_data[14];    /* [XSI] addr value (actually larger) */
};

# sockaddr_in

定义在

#include <netinet/in.h>

结构体

struct sockaddr_in {
    //地址族
    short int sin_family;
    //端口号(使用网络字节序)
    unsigned short int sin_port;
    //地址
    struct in_addr sin_addr;
    //8字节数组,全为0,该字节数组的作用只是为了让两种数据结构大小相同而保留的空字节
    unsigned char sin_zero[8]
}

在 macos 中的定义

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];
};

类型声明

typedef unsigned char           __uint8_t;
typedef __uint8_t               sa_family_t;
typedef __uint16_t              in_port_t;

所以总的长度是一定的,但是 sin_family 的前一个字节被 sin_len 占用。

# 参考文档