1、认识端口号端口号(port)是传输层协议的内容• 端口号是一个2字节16位的整数;• 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来 处理;• IP地址端口号能够标识网络上的某一台主机的某一个进程;• 一个端口号只能被一个进程占用.0-1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的 端口号都是固定的.1024-65535:操作系统动态分配的端口号.客户端程序的端口号,就是由操作 系统从这个范围分配的.C socket n. (电源)插座(电器上的)插口插孔管座槽窝托座臼孔穴 vt. 把…装入插座给…配插座我们把ipport叫做套接字socket 所以网络通信的本质也是进程间通信2、TCP VS UDPTCP 协议传输层的有连接协议能可靠传输基于字节流工作UDP 协议传输层的无连接协议传输不可靠面向数据报3. 网络字节两个基础概念计算机存储多字节数字有两种方式假设数字0x12342 字节大端序Big-Endian高字节放低地址12 34小端序Little-Endian低字节放低地址34 12所有网络传输的数据统一规定使用大端序// h host主机 nnetwork网络 sshort(2字节) llong(4字节) htons() 主机短整型 → 网络字节序 htonl() 主机长整型 → 网络字节序 ntohs() 网络短整型 → 主机字节序 ntohl() 网络长整型 → 主机字节序单字节数据char、uint8_t不需要转换只有short、int 这种多字节整数才需要转字节序。单个字节不存在高低字节问题。字符串不需要字节序转换字符串是连续单字节字符不存在大小端问题。❗很多新手踩坑发送字符串调用 htons完全错误。只有自己组装二进制通信协议的时候才需要考虑。如果你只是用 send 发普通字符串HTTP 请求等不用管字节序。4. socket 编程接口socket 常见API // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol); // 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address,socklen_t address_len); // 开始监听socket (TCP, 服务器) int listen(int socket, int backlog); // 接收请求 (TCP, 服务器) int accept(int socket, struct sockaddr* address,socklen_t* address_len); // 建立连接 (TCP, 客户端) int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);5、sockaddr 结构