套接字描述符(UNIX环境高级编程笔记)

  套接字是通信端点的抽象。应用程序用套接字描述符访问套接字。套接字描述符在UNIX系统中被当做是一种文件描述符。许多处理文件描述符的函数可以用于处理套接字描述符。
  创建套接字需要调用socket函数:

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

  参数domain(域)确定通信的特征,包括地址格式。下图总结了由POSIX.1指定的各个域。各个域的常数都以AF_开头,意指地址族(address family)。
套接字描述符(UNIX环境高级编程笔记)
  参数type确定套接字的类型,进一步确定通信特征。
套接字描述符(UNIX环境高级编程笔记)
  参数protocol通常是0,表示为给定的域和套接字类型选择默认类型协议。在AF_INET通信域中,套接字类型SOCK_STREAM的默认协议是传输控制协议(transmission control protocol,TCP),SOCK_DGRAM的默认协议是UDP。
  对于数据包(SOCK_DGRAM)结构,两个对等进程之间通信不需要逻辑连接。只需要对等进程所使用的套接字送出一个报文。
  数据包提供了一个无连接的服务。字节流(SOCK_STREAM)要求在交换数据之前,在本地套接字和通信的对等进程的套接字之间建立一个逻辑连接。
  SOCK_STREAM套接字提供字节流服务,所以应用程序分辨不出报文的界限。
  SOCK_SEQPACKET套接字和SOCK_STREAM套接字很类似,只是从该套接字得到的是基于报文的服务而不是字节流服务。
  SOCK_RAW套接字提供一个数据报接口,用于直接访问下面的网络层(即因特网域的IP层)。使用这个接口时,应用程序负责构造自己的协议头部,这是因为传输协议(如TCP和UDP)被绕过了。当创建一个原始套接字时,需要有超级用户特权,这样可以防止恶意应用程序绕过内建安全机制来创建报文。
  文件描述符函数用于套接字时的行为
套接字描述符(UNIX环境高级编程笔记)
  套接字通信时双向的。可以采用shutdown函数来禁止一个套接字的I/O。

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

  如果how是SHUT_RD(关闭读),则无法从套接字中读取数据。如果how是SHUT_WR(关闭写 ),则无法通过套接字发送数据数据。如果how是SHUT_RDWR,则既无法读取数据,也无法发送数据。
  用close关闭套接字时,只有最后一个活动引用关闭时,close才释放网络端点。