一、网络套接字
-
在Linux中,Socket(套接字)表示进程间网络通信的特殊文件类型;
-
本质为内核借助缓冲区形成的伪文件;
与管道类似,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。
-
在TCP/IP协议中,
IP地址+TCP/UDP端口号
唯一标识网络通讯中的一个进程,因此IP地址+端口号
就对应一个socket文件; -
一个socket文件应当含有网络数据的五元组信息;
-
若要实现一个可以网络通信的进程,就绪要提前定义该进程的socket文件;
二、网络数据字节序
1、字节序是什么
- 字节序就是一个设备将(大于一个字节类型的)数据存放在内存中的顺序;
2、如何判断自己主机的字节序是大端or小端?
联合体判断
// 判断主机字节序
// 大多主机均为小端机
void byteOrder()
{
// 利用联合体特性查看
// 联合体成员共用同一块空间
union MyUnion
{
unsigned char a; //该联合体对象的前一个字节
unsigned int b; //该联合体对象共四个字节
};
MyUnion u;
u.b = 0x12345678;
if (u.a == 0x78)
{
cout << "小端" << endl;
}
else if (u.a == 0x12)
{
cout << "大端" << endl;
}
}
3、网络中的字节序
-
网络就是一种跨设备的进程通信机制,但不同设备有着不同的字节序类型(主机字节序),为保证数据在网络中的准确传输,规定传送至网络的数据必须是大端字节序(网络字节序);
-
在编写套接字socket文件时,五元组信息中的IP和端口号,必须经过字节序转换,数据内容可不转换;
因为在网络传输过程中,大多结点均需使用IP和端口号,而数据内容只有源主机和目的主机才会查看具体内容,且大多主机均为小端机,因此数据可不转换至网络字节序;
4、主机字节序和网络字节序的转换
- Linux socket网络编程中,经常会使用下面四个C标准库函数进行字节序间的转换:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); //把uint32_t类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort); //把uint16_t类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong); //把uint32_t类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort); //把uint16_t类型从网络序转换到主机序
- IP为4字节,端口号为2字节,因此: