Linux IPC:套接字(socket)学习小结(一)
最近正在进行入职培训,所以一直在死磕《APUE》和《UNP》这两本书来学习Linux进程间通信,打算写几篇相关博文就权当一个笔记来记录这段时期的学习心得了
Unix系统提供的很多经典进程间通信机制(IPC)如Pipe、消息队列、共享内存等都是面向同一台计算机上运行的进程(相关进程)之间,所以套接字(socket)存在便是为了允许在不相关的进程(或是不同主机)间创建类似管道的连接。在《Unix/Linux编程实践教程》中将socket通信比喻为打电话查询时间服务的过程,我觉得甚为形象,所以这里也借用了这个类比。
socket
Socket原意便是插座的意思,在进程通信机制中被定义为通信端点的抽象,他在Unix系统中被当做一种文件描述符,可用read和write对其进行处理(这也正如打电话,我们从电话机中发送信号和接受信号)。
下面为socket函数原型:
include <sys/socket>
int socket (int domain, int type, int protocol);
//成功则返回socket文件描述符,失败则返回-1
第一个参数domain(域)是确定通信特性,包括地址的格式;
域 | 描述 |
---|---|
AF_INET | IPv4因特尔网 |
AF_INET6 | IPv6因特尔网 |
AF_UNIX | Unix域 |
AF_UPSPEC | 未指定 |
参数type是确定套接字的类型;参数protocl通常设为0,即表示为给定的domain和type选择默认协议。
类型 | 描述 |
---|---|
SOCK_DGRAM | AF_INET中该类型默认协议是UDP |
SOCK_RAW | IP协议的数据报接口 |