一、SOCKET网络套接字
在网络中,要进行两台主机之间的通信,我们需要借助SOCKET网络套接字,那么什么是套接字呢,我们先来认识以下两个概念IP地址和端口号。
1.IP地址
IP协议位于网络层,IP协议有两个版本,一个是IPV4,另外一个是IPV6,这里我们讨论的是IPV4协议,IP地址又叫软件地址,是在全世界内标识唯一一台主机的地址,对应IPV4来说,IP地址是占4个字节的,例如“192.168.0.0“,我们通常习惯的用这种点分十进制的字符串形式来表示IP地址,用点分割开的每一个数字表示一个字节,范围从0到255.
在数据发送时,它需要从定向下,贯穿整个协议栈,当通过IP协议这一层的时候,数据会封装IP数据报头,包括源IP地址和目标IP地址。
2.端口号
但是我们在通信的时候,仅仅是把数据从一台主机发往另外一台主机嘛?答案肯定是不是的,我们实际在通信的时候是把数据交付给目标主机的某一个进程来接受,那主机里面的进程那么多,怎么区分要交付的是哪一台主机呢,端口号就起到了这样的作用。
端口号是一个两个字节16为的整数,它用来唯一标识一个进程,告诉操作系统,数据该交付给哪一个进程来处理。一个进程可以绑定多个端口号,但是一个端口号只能被一个进程占用。
所以IP地址+端口号,就可以唯一标识一台主机中的一个进程,我们把
IP地址加上端口号就叫做SOCKET
。
二、网络字节序
在学习C语言的时候,我们知道了每一台主机由于CPU构架的不同,就有大小端之分。我们把数据的低字节放在内存的低地址这种形式就叫做大端,相反的,我们把数据的低字节放在内存的高地址处,就叫做大端。
在网络数据的传输中,因为通信的两台主机并不知道对方是大端还是小端,因此如果不统一的规定传输的协议,就很有可能出现发送方和接收方的数据不一致的问题。因此TCP协议规定:
(1)发送方主机通常将发送缓冲区的数据从低地址向高地址的顺序发送。
(2)接收方主机把接收到的数据按照从低地址向高地址来存放到接收缓冲区。
(3)TCP/IP协议规定,网络字节序一律采用大端字节序。即低字节存高地址。
所以,我们在发送数据的时候,必要的时候,需要把主机字节序转换为网络字节序,在接收的时候,同样,也要把网络字节序转换成主机字节序。下面我们介绍几个完成这项工作的接口:
这几个函数很好理解和记忆,h表示host(主机),n表示net(网络),s表示short int, l表示long。例如htonl()这个函数就是把32位主机字节序转换成网络字节序。