目录
进程间通信的方式有:管道、套接字、共享内存、消息对列、信号量
管道,信号量,共享内存见之前博客。
套接字:是管道概念的一个扩展,Linux系统支持套接字接口。可以通过使用管道类似的方法来使用套接字,套接字还包括计算机网络中的通信,常用于网络编程。
Windows系统的套接字服务是由系统文件winsock.dll来提供。
- 套接字连接的工作原理
- 套接字的属性、地址和通信
- 网络信息和互联网守护进程
- 客户和服务器
一、什么是套接字?
套接字是一种通信机制。凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。Linux所提供的功能和网络工具通常都是通过套接字来进行通信的。
套接字机制可以实现将多个客户连接到一个服务器。
二、如何通过套接字来维持一个连接的?
首先,服务器应用程序用系统调用socket来创建一个套接字,它是系统分配给该服务器进程的类似文件描述符的资源,它不能与其他进程共享。
接下来,服务器进程会给套接字起个名字。本地套接字的名字是Linux文件系统中的文件名,一般放在/tmp或/usr/tmp目录中。对于网络套接字,它的名字是与客户连接的特定网络有关的服务标识符(端口号或访问点),这个标识符允许Linux将进入的针对特定端口号的连接转到正确的服务器进程。
系统调用bind来给套接字命名。然后服务器进程就开始等待客户连接到这个命名套接字。
Listen的作用是,创建一个队列并将其用于存放来自客户的进程连接。、
服务器通过系统调用accept来接受客户的连接。
服务器调用accept时,它会创建一个与原有的命名套接字不同的新的套接字,这个新套接字只用来与这个特定的客户进行通信,而命名套接字则被保留下来继续处理来自其他客户的连接。
客户端:首先调用socket创建一个未命名套接字,然后将服务器的命名套接字作为一个地址来调用connect与服务器建立连接。
连接建立好,可以实现双向的数据通信
查看套接字文件:ls -lF ps lx
三、套接字属性
域(domin)、类型(type)和协议(protocol)。套接字还用地址作为它的名字。地址的格式随域(协议族,protocol family)的不同而不同。每个协议族又可以使用一个或多个地址族来定义地址格式。
1)域
域指定套接字通信中使用的网络介质。最常见AF_INET,它指的是Internet网络。其底层协议-网际协议(IP)只有一个地址族,它使用IP地址来指定计算机中的网络。域名都会被转换为底层的IP地址
IP端口可以用来指定一台服务器计算机上的某个特定服务。在系统内部,端口通过一个唯一的16位整数来标识。在系统外部,IP地址和端口号来一起确定。
套接字作为通信的终点,它必须在开始终点之前绑定一个端口。
2)套接字类型
因特网协议提供了两种通信机制:流(stream)和数据报(datagram)。
- 流式套接字
在某些方面类似于标准的输入/出流,提供的是有序、可靠、双向字节流的连接。可以确保发送的数据不会丢失,赋值或者乱序到达。大的消息会被分片、传输、再重组。
流套接字由SOCK_STREAM指定,在TCP/IP连接实现
- 数据报套接字
由SOCK_DGRAM指定,数据报套接字不建立连接。对发送的数据报的长度有限制。它作为一个单独的网络消息被传输,存在丢失、复制或乱序到达。由UDP/IP连接实现,提供无序的不可靠的服务。
3)套接字协议
只要底层的传输机制允许不止一个协议来提供要求的套接字类型,就可以为套接字选择一个特定的协议。不需要选择的话,使用默认值。
四、创建套接字
1.socket系统调用创建一个套接字并返回一个描述符,该描述符可以用来访问该套接字。
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
domain参数指定协议族,type参数指定套接字的通信类型,protocol指定使用的协议。
- domain可以指定的协议族常用的有AF_UNIX 和 AF_INET。AF_UNIX用于通过UNIX和Linux文件系统实现本地套接字,或者用于UNIX网络套接字。AF_INET套接字可以用于TCP/IP网络进行通信的程序。Windows下的Winsock接口也提供了对套接字的访问功能。
- type的取值包括SOCK_STREAM和SOCK_DGRAM。SOCK_STREAM是一个有序、可靠、面向连接的双向字节流。对于AF_INET域套接字来说,它是依靠TCP连接来提供这一特性,TCP连接在两个流套接字之间建立。SOCK_DGRA是数据报服务。我们可以用它来发送最大长度固定的消息,但是它不保证可靠性,对于AF_INET域套接字来说,它是依靠UDP连接来提供这一特性。
- protocol通常设为0,表示使用默认协议。
socket系统调用返回的是一个描述符,类似于底层的文件描述符。当两个套接字建立起连接之后,就可以使用read和write系统调用来通过这个描述符在套接字上发送和接收数据。
close系统调用用于关闭连接,关闭之后系统会回收之前被占用的描述符。
五、关于套接字的其它系统调用
bind、listen、accept、connect这些都是基于TCP连接的,基本网络编程时用到的系统调用,等到后面有时间写到了再详解呦!