一、套接字编程原理
利用在应用层与传输层之间提供应用程序设计接口实现对内核程序(协议)的操作和管理。

二、什么是套接字
1、起源:是一种网络编程接口,1983年最初提出(伯克利套接字接口——Berkeley Socket API),用于Unix的衍生系统BSD系统,1991年windows基于伯克利套接字接口制定了Windows网络应用程序编程接口(Windows Socket API)。winsock API通过套接字(socket)进行通信
2、含义:
可以理解为TCP/IP网络编程接口的集合,包含了许多函数
可以理解为通信连接的一个端点,其主要包括协议、主机IP地址和端口号,将两个套接字连接到一起便可以在不同应用进程之间传递数据

忽略底层通信过程,网络中的通信就是由发送者将信息写入套接字,通过中间环节传输到接收端的套接字中,被接收端应用程序读取的过程。
基于套接字的通信过程可以描述为: 创建/打开套接字、向套接字收发数据、关闭套接字。
套接字的本质是通信过程中所要使用的一些缓冲区及相关的数据结构。
三、套接字分类
1、流套接字,可靠的,面向连接的双向数据传输,被传输的数据看作是无记录边界的字节流。(TCP)
2、数据报套接字,不可靠,无连接的双向数据传输,数据以有记录边界的独立的包形式被发送。(UDP)
3、原始套接字,允许对较低层协议(如IP或ICMP)进行直接访问
四、套接字工作机制
1、通信过程与基本函数
服务端创建提供服务的套接字,同时确定所使用的协议(socket()函数)
将服务端口号与服务以及本地IP进行绑定(bind()函数)
监听客户端请求(listen()函数)
客户端发出服务请求(socket()——connect())
服务器建立新套接字接收请求,与客户端建立IP与端口关联(accept()函数)
向/从套接字发送/接收数据(recv()与send() 函数)
关闭套接字,释放通信资源(closesocket()函数)
Little endian:将低位字节存储在起始地址(低序字节序、主机字节顺序)
Big endian:将高位字节存储在起始地址(高序字节序、网络字节顺序),TCP/IP中规定的数据格式
以字节为单位
格式转换:(htons/ntohs、htonl/ntohl、inet_ntoa/inet_addr)
2、错误检查与控制——SOCKET_ERROR
int WSAGetLastError(void) 获取错误详情的说明
3、字节顺序
含义:占内存多于一个字节类型的数据在内存中的存储顺序。通常有如下两种存储顺序:

举例:
如一个32位的长整型数 0x12 34 56 78 存储在内存中以1000开始连续地址内
192.168.1.12 <——> 0xC0 0xA8 0x01 0x0C
4、数据结构



