网络IPC之套接字

UNIX系统提供了管道、消息队列、信号量、以及共享内存等进程间通信机制,通过这些机制,同一台计算机上运行的进程可以相互通信。而不同计算机上进程相互通信的机制就是网络间通信network IPC。


套接字是通信端点的抽象。与文件描述符访问文件一样,套接字也要用套接字描述符。套接字描述符在UNIX系统是用文件描述符实现的。许多处理文件描述符的函数都可以处理套接字描述符。


要创建一个套接字,可以调用socket函数。
调用socket与调用open类似,均可获得输入/输出的文件描述符。当不需要时,调用close关闭套接字的访问,并释放套接字以便重新使用。

#include <sys/socket.h>
int socket(int domain, int type, int protocol);
返回值:成功返回套接字描述符,出错返回-1

参数:

domain确定通信的特性,包括地址格式。常用的有
AF_INET         IPv4因特网域
AF_INET6       IPv6因特网域
AF_UNIX         UNIX域
AF_UNSPEC  未指定
type确定套接字类型。实现中可以自由增加对其他类型的支持。常用的有:
SOCK_DGRAM            长度固定的、无链接的不可靠报文传递
SOCK_RAW                 IP协议的数据报接口
SOCK_SEQPACKET   长度固定的、有序、可靠的面向链接报文传递
SOCK_STREAM          有序、可靠、双向的面向字节流
参数protocol通常是0,表示按给定的域和套接字类型选择默认协议。当对同一域和套接字类型支持多个协议时,可以使用protocol参数选择一个特定协议


说明:

AF_INET通信域中套接字类型SOCK_STREAM默认协议是TCP(传输控制协议)。
AF_NET通信域中套接字类型SOCK_DGRAM的默认协议是UDP(用户数据报协议)。
对于SOCK_DGRAM接口,通信时不许要连接,秩序发送一个报文,地址就是对方进程所使用的套接字。
对于SOCK_STREAM要求在交换数据之前,在本地套接字和与之通信的远程套接字之间建立一个连接。

发送数据报类似给某人邮寄信件。可以邮寄很多信,但不能保证投递的次序,并且可能有些信件丢失在路上。每封信件包含接收者的地址,使这封信件独立于所有其他信件。每封信件可能送达不同的接收者。
使用面向连接的协议就像与对方打电话。首先通过电话建立一个连接,连接建立好之后,彼此能双向的通信。每个连接是端到端的通信信道,会话中不包含地址信息,连接本身暗含特定的源和目的地址。

对于SOCK_STREAM套接字,应用程序意识不到报文界限,因为套接字提供的是字节流服务,这意味着当从套接字读数据时,它也许不会返回所有由发送进程所写的字节数。最终可以获得发送过来的所有数据,但也许要通过若干次函数调用得到。
SOCKET_SEQPACKET套接字和SOCK_STREAM套接字很类似,但从该套接字得到的是基于报文的服务而不是字节流服务。所以从SOCKET_SEQPACKET套接字接收的数据量与对方发送的一致。流控制传输协议(Stream Control Transmission Protocol, SCTP)提供了因特网上的顺序数据包服务。


套接字通信是双向的。可以采用shutdown禁止套接字上的输入/输出。

#include <sys/socket.h>
int shutdown(int sockfd, int how);
返回值:成功则返回0,出错返回-1

参数:

sockfd,套接字描述符
how,描述禁止哪些操作
how的方式有三种分别是
SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。
SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。
SHUT_RDWR(2):关闭sockfd的读写功能。


能够调用close关闭套接字描述符,为什么还使用shutdown呢?

理由是:close只有在最后一个活动引用被关闭时才释放,例如,调用dup复制一个套接字描述符,套接字直到关闭了最后一个引用它的文件描述符后才释放。而shutdown允许在不考虑引用它的文件描述符的数目情况下,关闭套接字的活动。对于只关闭双向传输中的一个方向会很方便。例如,让所有通信的进程能够确定数据发送结束,可以关闭写端,此时仍可以继续接收数据。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值