进程间通信(Sockets)
进程间通信是由操作系统提供的机制,允许进程之间相互通信。这种通信可能包括一个进程让另一个进程知道某个事件已经发生,或者将数据从一个进程传输到另一个进程。
使用套接字是管理进程间通信的一种方法。它们提供两个进程之间的点对点双向通信。套接字是通信的端点,可以绑定名称。一个套接字可以与一个或多个进程关联。
套接字类型
套接字的类型如下:
顺序分组套接字:这种类型的套接字为数据报提供可靠的连接,数据报的最大长度是固定的。此连接是双向的,并且是有序的。
数据报套接字:数据报套接字支持消息的双向流动。在数据报套接字中,接收方可能接收到的消息顺序与发送顺序不同。数据报套接字的操作类似于通过邮件将信件从源传递到目的地的操作。
流套接字:流套接字的操作类似于电话交谈,并提供双向可靠的数据流,没有记录边界。此数据流也是有序的且不重复的。
原始套接字:可以使用原始套接字访问底层通信协议。
套接字创建
可以使用以下声明在特定域和特定类型中创建套接字:
int socket(int domain, int type, int protocol)
如果在上述系统调用中未指定协议,则系统使用支持套接字类型的默认协议。返回套接字句柄,它是一个描述符。
bind 函数调用用于将互联网地址或路径绑定到套接字。如下所示:
int bind(int s, const struct sockaddr *name, int namelen)
连接流套接字
连接流套接字不是对称的过程。一个进程充当服务器,另一个进程充当客户端。服务器使用以下声明指定可以排队的连接请求数:
int listen(int s, int backlog)
客户端使用以下声明启动与服务器套接字的连接:
int connect(int s, struct sockaddr *name, int namelen)
以下声明返回对该特定连接有效的新的套接字描述符:
int accept(int s, struct sockaddr *addr, int *addrlen)
流数据传输
send() 和 recv() 函数用于使用套接字发送和接收数据。它们类似于 read() 和 write() 函数,但包含一些额外的标志。send() 和 recv() 的声明如下:
int send(int s, const char *msg, int len, int flags)
int recv(int s, char *buf, int len, int flags)
关闭流
通过调用 close() 来丢弃或关闭套接字。
广告