Socket套接字
不同主机间的相互通信:❤️
-
进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施:
- UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal)
- UNIX system V有:消息(message)、共享存储区(shared memory)和信号量(semaphore)等.
-
上述的进程间通信的方式都是依靠Liunx内核进行的,所以只能用在本机进程之间通信。网间进程通信就解决了不同主机进程间的相互通信的问题
-
IP地址:在Internet上为每台计算机指定的唯一的32位地址称为”IP地址“,也称”网际结构“。IP地址具有固定、规范的格式,它由32位二进制数组成,分成4段,其中每8位构成一段,这样,每段所能表示的二进制数的范围最大不超过255,段与段之间用”."隔开。为了便于标识和表达,IP地址以十进制形式表示,每8位二进制数用一个十进制数表示。
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char* straddr,struct in_addr *addrp);//点分十进制转二进制,第一个参数为十进制IP,第二个参数指向二进制的存放 char* inet_ntoa(struct in_ addr inaddr);//二进制转点分十进制
-
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
-
TCP/IP协议存在于OS中,网络服务通过OS提供,在OS中增加支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等
-
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种:
- TCP/IP协议族包括运输层、网络层、链路层,而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。
套接字socket:❤️
- socket即是一种特殊的文件(S),可以用“打开open –> 读写write/read –> 关闭close”模式来操作
- socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
- 其实socket也没有层的概念,它只是一个facade设计模式的应用,让编程变的更简单。是一个软件抽象层。在网络编程中,我们大量用的都是通过socket实现的。
网络字节序与主机字节序:❤️
-
字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序
-
主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian和Little-Endian的定义如下:
- Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
- Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
上图来自网络
-
网络字节序:4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。
-
字节序转换函数
#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); //h表示host,主机,n表示network,网络,l表示32位长整数(long),s表示16位短整数(short)。
Socket编程:❤️
Socket编程的一般步骤
服务端:
-
创建Socket套接字,用Socket ()函数
-
设置Socket属性
-
为套接字添加信息(IP地址和端口号)用bind()函数
-
开启监听,用listen()函数
-
监听到有客户端接入,接受一个连接,用accept()函数
-
交换数据,用函数send()和recv(),或者用read(),write()
-
关闭套接字,断开连接
客户端:
- 创建一个Socket,用Socket函数
- 设置Socket属性
- 连接服务器,用connect()函数
- 交换数据,用函数send()和recv(),或者用read(),write()
- 关闭网络连接
socket接口函数
头文件
#include <sys/types.h>
#include <sys/socket.h>
Socket函数
-
函数原型
int socket(int domain, int type, int protocol);
-
功能:用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数
-
参数:
- protofamily:协议族(family)。常用的协议族有:AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
- type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。
- protocol:指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。