与套接字的进程间通信

进程间通信是操作系统提供的一种机制,它允许进程相互通信。这种通信可能涉及一个进程,该进程让另一个进程知道某个事件已经发生,或者将数据从一个进程转移到另一个进程。

管理进程间通信的方法之一是使用套接字。它们提供了两个过程之间的点对点,双向通信。套接字是通信的端点,可以将名称绑定到它们。套接字可以与一个或多个进程关联。

类型的套接字

套接字的不同类型如下所示-

  • 顺序数据包套接字:此类型的套接字为最大长度固定的数据报提供可靠的连接。此连接是双向的和顺序的。

  • 数据报套接字:数据报套接字支持双向消息流。数据报套接字中的接收器可能以与发送消息不同的顺序接收消息。数据报套接字的操作类似于通过邮件将字母从源传递到目标的操作。

  • 流套接字:流套接字的操作类似于电话对话,并提供双向且可靠的数据流,而没有记录边界。此数据流也已排序且不重复。

  • 原始套接字:可以使用原始套接字访问基础通信协议。

套接字创建

可以使用以下声明在特定域和特定类型中创建套接字-

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()