UNIX系统提供了管道、消息队列、信号量、以及共享内存等进程间通信机制,通过这些机制,同一台计算机上运行的进程可以相互通信。而不同计算机上进程相互通信的机制就是网络间通信network IPC。
套接字是通信端点的抽象。与文件描述符访问文件一样,套接字也要用套接字描述符。套接字描述符在UNIX系统是用文件描述符实现的。许多处理文件描述符的函数都可以处理套接字描述符。
要创建一个套接字,可以调用socket函数。
调用socket与调用open类似,均可获得输入/输出的文件描述符。当不需要时,调用close关闭套接字的访问,并释放套接字以便重新使用。
#include <sys/socket.h> int socket(int domain, int type, int protocol); 返回值:成功返回套接字描述符,出错返回-1
参数:
domain确定通信的特性,包括地址格式。常用的有
说明:
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,套接字描述符
能够调用close关闭套接字描述符,为什么还使用shutdown呢?
理由是:close只有在最后一个活动引用被关闭时才释放,例如,调用dup复制一个套接字描述符,套接字直到关闭了最后一个引用它的文件描述符后才释放。而shutdown允许在不考虑引用它的文件描述符的数目情况下,关闭套接字的活动。对于只关闭双向传输中的一个方向会很方便。例如,让所有通信的进程能够确定数据发送结束,可以关闭写端,此时仍可以继续接收数据。
原文:http://blog.csdn.net/aspnet_lyc/article/details/21158497