网络IPC:套接字 -- (1)套接字描述符

1. 套接字描述符

  套接字时通信端点的抽象。正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字。套接字描述符在UNIX系统中被当作一种文件描述符。

  为创建一个套接字,使用socket函数。

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

  参数domain(域)确定通信的特性,包括地址格式。各个域都有自己表示地址的格式,而表示各个域的常数都以AF_开头,意指地址族(address family)。

域     描述
AF_INET IPv4因特网域
AF_INET6 IPv6因特网域  
AF_UNIX   UNIX域
AF_UNSPEC   未指定

 

 

 

 

 

 

  参数type确定了套接字的类型,进一步确定通信特性。

类型   描述
SOCK_DGRAM   固定长度、无连接的、不可靠的报文传递
SOCK_RAW     IP协议的数据报接口
SOCK_SEQPACKET 固定长度的、有序的、可靠的、面向连接的报文传递
SOCK_STREAM 有序的、可靠的、双向的、面向连接的字节流

 

 

 

 

 

 

  参数protocal通常是0,表示为给定的域和套接字类型选择默认协议。当对同一域和套接字类型支持多个协议时,可以使用protocol选择一个特定的协议。在AF_INET通信域中,套接字类型SOCK_STREAM的默认协议是TCP,在套接字类型SOCK_DGRAM的默认协议是UDP。

协议 描述
IPPROTO_IP IPv4网际协议
IPPROTO_IPV6 IPv6网际协议
IPPROTO_ICMP 因特网控制报文协议
IPPROTO_RAW 原始IP数据包协议
IPPROTO_TCP 传输控制协议
IPPROTO_TCP 网络用户报文协议

 

 

 

 

 

 

 

 

  对于数据报(SOCK_DGRAM)接口,两个对等进程之间通信时不需要逻辑连接。只需要向对等进程所使用的套接字送出一个报文。因此数据包提供了一个无连接的服务。

  另一方面,字节流(SOCK_STREAM)要求在交换数据之前,在本地的套接字和通信的对等进程的套接字之间建立一个逻辑连接。数据报就像发邮件,不需要连接。字节流就像打电话,需要先建立连接。

  SOCK_SEQPACKET套接字和SOCK_STREAM套接字类似,只是从该套接字得到的是基于报文的服务而不是字节流服务。这意味着从SOCK_SEQPACKET套接字接收的数据量与对方所发送的一致。流控制传输协议(SCTP)提供了因特网域上的顺序数据包服务。

  SOCK_RAW套接字提供一个数据报接口,用于直接访问下面的网络层(即因特网中的IP层)。使用这个接口时,应用程序负责构造自己的协议头部,这是因为传输协议(如TCP和UDP)被绕过了,当创建一个原始套接字时,需要有admin权限,这样可以防止恶意程序绕过内建安全机制来创建报文。

  套接字通信是双向的。可以采用shutdown函数来禁止一个套接字的I/O。

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

  how参数,SHUT_RD(关闭读端),SHUT_WR(关闭写端),SHUT_RDWR(读写关闭)

posted @ 2022-03-09 16:26  Disant  阅读(241)  评论(0)    收藏  举报