15-总结
56.7 总结
socket允许在同一主机或通过一个网络连接起来的不同主机上的应用程序之间通信。
一个socket存在于一个通信domain中,通信domain确定了通信范围和用来标识socket的地址格式。SUSv3规定了UNIX(AF_UNIX)、IPv4(AF_INET)以及IPv6(AF_INET6)通信domain。
大多数应用程序使用流socket和数据报socket中的一种。流socket(SOCK_STREAM)为两个端之间提供了一颗可靠的、双向的字节流通信信道。数据报socket(SOCK_DGRAM)提供了不可靠的、无连接的、面向消息的通信。
一个典型的流socket服务器会使用socket()创建其socket,然后使用bind()将这个socket绑定到一个众所周知的地址上。服务器接着调用listen()以允许在该socket上接受连接。监听socket上的客户端连接是通过accept()来接受的,它将返回一个与客户端的socket进行连接的新socket的文件描述符。一个典型的流socket客户端会使用socket()创建一个socket,然后通过调用connect()建立一个连接并制定服务器的众所周知的地址。当两个流socket连接之后就可以使用read()和write()在任意一个方向上传输数据了。一旦拥有引用一个流socket端点的文件描述符的所有进程都执行了一个隐式或显示的close()之后,连接就会终止。
一个典型的数据报socket服务器会使用socket()创建一个socket,然后使用bind()将其绑定到一个众所周知的地址上。由于数据报socket是无连接的,因此服务器的socket可以用来接收任意客户端的数据报。使用read()或socket特定的recvfrom()系统调用能够接收数据报,其中recvfrom()能够返回发送socket的地址。一个数据报socket客户端会使用socket()创建一个socket,然后使用sendto()将一个数据报发送到指定的(即服务器的)地址上。connect()系统调用可以用来为数据报socket设定一个对等地址。在设定完对等地址之后就无需为发出去的数据报指定目标地址了;write()调用可以用来发送一个数据报。
更多信息
参考59.15节列出的更多信息源。