Unix域套接字不是一个实际的协议族,是在单个主机上执行的客户/服务器通信的一种方法,所用的API与网络通信的API是一致的,Unix提供两类套接字:字节流套接字(类似TCP)和数据报套接字(类似UDP)
使用Unix套接字有以下三个理由:1.比相同的TCP同主机通信实现要快一杯
2.可用于不同进程的通信
3.可以提供额外的安全检查措施
struct sockaddr_un
{
__SOCKADDR_COMMON (sun_);
char sun_path[108]; /* Path name. */
};
Unix套接字的地址结构如上,对其使用bind等函数即可
非阻塞IO
套接字的默认操作是阻塞的
非阻塞IO使得程序能够发挥动态性的优势,使得只要IO有可能发生,就会发生IO
非阻塞connect
对一个非阻塞的TCP套接字调用connect时,connect立即返回EINPROGRESS错误,然后TCP建立三次握手
非阻塞的connect有三个用途
1.connect完成要花一个RTT时间
2.可以使用这个技术同时建立多个连接
3.可以实现自定义的connect超时时间
非阻塞的connect需要处理一些细节
1. 若连接到的服务器在同一个主机上(既自己连接自己),那么连接将立刻建立
2.当连接成功时,描述符将可写,当连接错误时,描述符将可读可写(TCP套接字出现错误的默认处理方式)
非阻塞accept
情景:客户端connect之后发送一个RST,服务端在该连接进入ESTABLISHED队列后,accept调用前,收到RST并且将连接移除ESTABLISH队列,这个时候accept调用将一直阻塞,服务器无法响应其他客户的连接,解决方案:使用非阻塞的accpet