同一台计算机上运行的进程可以相互通信:
经典的进程间通信IPC:管道、先进先出、消息队列、信号量以及共享内存。
不同计算机(通过网络连接)上运行的进程相互通信:
网络进程间通信(network IPC)。
套接字(socket):是一种特殊的I/O接口,它也是一种文件描述符。
套接字是通信端点的抽象。
应用程序访问文件需要使用文件描述符,访问套接字也需要使用套接字的文件描述符。
许多处理文件描述符的函数都可以处理套接字的文件描述符。
怎样获得套接字的文件描述符?要创建一个套接字,可以使用socket函数。
#include <sys/socket.h>
int socket (int domain, int type, int protocol)
成功返回套接字描述符,出错返回-1
Domain(域):确定通信的特性,包括地址格式。
Type:确定套接字的类型。
Protocol:通常是0 ,表示按给定的域和套接字类型选择默认的通信协议。
调用套接字socket和调用open相类似。
套接字通信是双向的。
可以使用函数shutdown来禁止套接字的输入输出。
int shutdown(int sockfd,int how)
how:SHUT_RD(关闭读端),SHUT_WR(关闭写端),SHUT_RDWR(关闭读写端)
生成套接字,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。
Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。如图1:
Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。
要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。