一、概述
前面几篇文章的进程间通信均基于同一台Linux内核实现的,因此无法实现多机(和手机、单片机、X86架构等)通讯,因此引入网络通讯,入门先学习Socket(又叫做套接字)网络编程。网络编程需要用到地址和数据格式。地址需要“IP地址+端口号”来对应;数据格式有https、TCP、UDP等,socket网络编程常用TCP、UDP。
二、TCP/UDP对比
1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接;
2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;
3. TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);
4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
5. TCP首部开销20字节;UDP的首部开销小,只有8个字节;
6. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
三、端口号作用
•一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。
•实际上是通过“IP地址+端口号”来区 分不同的服务的。端口提供了一种访问通道,服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。
四、字节序
1.什么是字节序?
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
•小端字节序:将低序字节存储在起始地址
•大端字节序:将高序字节存储在起始地址
网络字节序 = 大端字节序
2.字节序转换API
Notes:h代表host,n代表net,s代表short(两个字节),l代表long(4个字节)。
(1)主机字节序转网络字节序
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); 无符号的32位整型数据的转换
int16_t htons(uint16_t hostshort); 无符号的16位整型数据的转换
功能:htons和htonl都是实现将主机字节序数据转换为网络字节序数据
参数:hostlong和hostshort标识主机字节序数据
返回值:网络字节序数据
(2)网络字节序转主机字节序
#include <arpa/inet.h>
uint32_t ntohl(uint32_t netlong); 无符号的32位整型数据的转换
uint16_t ntohs(uint16_t netshort); 无符号的16位整型数据的转换
参数:netlong和netshort标识网络字节序数据
返回值:主机字节序数据