物理层(IEEE),数据链路层(PPP,ARP,MTU),网络层(IP,ICMP,BGP),传输层(TCP,UDP),会话层,表示层,应用层(TFTP,HTTP,DNS)
链路层(网络接口和物理层),网络层,传输层,应用层
1、是否有名称
无名管道:没有名字,只能在创建它的进程及其子进程之间使用。
有名管道:有一个名字,可以在文件系统中看到,允许不相关的进程之间进行通信。它在文件系统中以文件形式存在,通常以文件路径的方式访问。
2、生存周期
无名管道:随创建它的进程终止而消失,一旦进程结束,管道也随之消亡。
有名管道:在文件系统中存在,独立于创建它的进程,即使进程结束,有名管道的文件仍然存在,直到显式删除。
3、使用场景
无名管道:适用于父子进程之间的数据交换,例如在管道符“|”连接的两个命令之间传递数据。因为它只能用于关联的进程(通常是父子关系),所以更适合单个进程创建并控制的子进程。
有名管道:适合任意不相关的进程之间通信。例如,在不同进程间持续传递数据。一个进程写入有名管道,另一个进程读取即可。常用于多进程服务器或需要跨进程通信的应用程序。
4、文件系统中的表现
无名管道:仅在内存中存在,不会在文件系统中留下文件。
有名管道:在文件系统中创建一个具名文件,可以通过mkfifo命令来创建,在Unix或Linux系统中通常位于/tmp目录中。
5、实现方法
无名管道:通过pipe()系统调用创建。
有名管道:通过mkfifo()系统调用或在命令行中使用mkfifo命令创建。
服务器端
使用socket()函数创建一个套接字。
使用bind()函数绑定套接字到指定的地址和端口。
使用listen()函数让套接字进入监听状态,等待客户端的连接。
使用accept()函数接受客户端的连接,并返回一个新的套接字用于通信。
使用read()函数从客户端读取数据,并使用send()函数将数据发送回客户端。
客户端
使用socket()函数创建一个套接字。
使用connect()函数连接到服务器的地址和端口。
使用send()函数发送数据到服务器,并使用read()函数读取服务器的响应。
select:简单且广泛兼容,但有文件描述符数量限制,效率低。
poll:没有文件描述符数量限制,仍然需要遍历所有描述符,效率中等。
epoll:效率最高,尤其适合大量文件描述符和高并发场景,支持事件驱动。
epoll通常是大规模、高并发网络应用的首选,特别是对于Linux系统开发

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/193389.html