网络编程(七)
UNIX域套接字(本地间进程间通信的技术)(S文件)
socket同样也可以用于本地通信(类似:管道,共享内存,消息队列,信号。。。)
效率:共享内存 > UNIX域套接字 > 消息队列 > 管道。。。。
UNIX域套接字不会出现丢包现象,非常安全可靠的!
创建套接字时使用本地协议PF_UNIX(或PF_LOCAL)。
分为流式套接字和用户数据报套接字
和其他进程间通信方式相比使用方便、效率更高
常用于前后台进程通信
基于TCP传输
TCP方式创建的unix域套接字通信,类似于无名管道,实现双向通信只需要一个文件(用于两个不相关进程或前后台进程)
在bind阶段才创建s文件
服务端server:
- socket(PF_UNIX,SOCK_STREAM)
- bind(struct sockaddr_un)
- lisen
- accept
- IO
客户端client:
- socket(PF_UNIX,SOCK_STREAM)
- connect
- IO
基于UDP传输
udp方式的unix域套接字通信,类似于有名管道,实现双向通信需要两个文件
unlink("hello"); 删除已经存在的套接字文件
服务端(server):创建的aaa套接字文件只是用来收数据,使用客户端创建的bbb文件来发数据
- socket
- bind
- IO
客户端(client):创建的bbb套接字文件只是用来收数据,使用服务端创建的aaa套接字文件来发数据
- socket
- bind
- IO
注意:
当使用socket()创建通信的套接字时:
1、传入:AF_INET,客户端可以自己不主动绑定IP和端口,那是系统自己会去bind()
2、传入:AF_UNIX/AF_LOCAL,客户端这边必须主动bind()它的通信文件addr.sun_path的内容以及addr.sun_family,以此告知服务器,它的通信文件位于本地上的哪一个地方,以后通信就使用该文件来进行数据交互!!!服务器也是一样的,需要bind()!!!