进程间通信是操作系统提供的一种机制,它允许进程相互通信。这种通信可能涉及一个进程,该进程让另一个进程知道某个事件已经发生,或者将数据从一个进程转移到另一个进程。
管理进程间通信的方法之一是使用套接字。它们提供了两个过程之间的点对点,双向通信。套接字是通信的端点,可以将名称绑定到它们。套接字可以与一个或多个进程关联。
套接字的不同类型如下所示-
顺序数据包套接字:此类型的套接字为最大长度固定的数据报提供可靠的连接。此连接是双向的和顺序的。
数据报套接字:数据报套接字支持双向消息流。数据报套接字中的接收器可能以与发送消息不同的顺序接收消息。数据报套接字的操作类似于通过邮件将字母从源传递到目标的操作。
流套接字:流套接字的操作类似于电话对话,并提供双向且可靠的数据流,而没有记录边界。此数据流也已排序且不重复。
原始套接字:可以使用原始套接字访问基础通信协议。
可以使用以下声明在特定域和特定类型中创建套接字-
int socket(int domain, int type, int protocol)
如果以上系统调用中未指定协议,则系统使用支持套接字类型的默认协议。返回套接字句柄。它是一个描述符。
绑定函数调用用于将Internet地址或路径绑定到套接字。这显示如下-
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()
。