管道和插座有什么区别?

bot*_*bot 56 networking network-programming tcp

我找到了几个答案,但它们似乎与Windows机器有关.所以我的问题是管道和插座之间的区别是什么,何时/如何选择一个而不是另一个?

Mik*_*ton 70

管道和插座之间有什么区别,何时/如何选择其中一个?

管道和套接字都处理字节流,但它们以不同的方式处理...

  • 管道仅存在于特定主机中,它们指的是虚拟文件之间的缓冲,或连接该主机内进程的输出/输入.管道内没有包的概念.
  • 套接字使用IPv4或IPv6打包通信; 通信可以扩展到localhost之外.请注意,套接字的不同端点可以共享相同的IP地址; 但是,他们必须侦听不同的TCP/UDP端口才能这样做.

用法:

  • 使用管道:
    • 当您想要将数据读/写为特定服务器中的文件时.如果您正在使用C,那么您read()和write()管道.
    • 当你想将一个进程的输出连接到另一个进程的输入时...请参阅popen()
  • 使用套接字在不同的IPv4/IPv6端点之间发送数据.通常,这发生在不同的主机之间,但是套接字可以在同一主机中使用

顺便说一句,您可以使用netcat或socat将套接字连接到管道.


Ale*_*Ale 23

要完成Mike给出的答案,重要的是要提到UNIX域套接字的存在,这些套接字可在任何符合POSIX的操作系统上使用.虽然在使用语义方面非常类似于"普通"互联网套接字,但它们纯粹是本地机器(当然互联网套接字也可以在本地工作),因此几乎就像管道一样.几乎是因为根据定义UNIX管道是单向的:

管道和FIFO(也称为命名管道)提供单向进程间通信通道.管道具有读取端和写入端.写入管道写入端的数据可以从管道的读取端读取.(摘自手册页管道(7))

UNIX域套接字也有一个非常不寻常的特性,除了数据之外,它们还允许发送文件描述符:这样,非特权进程可以访问其描述符已通过套接字发送的任何文件.根据维基百科的说法,这种技术被ClamAV防病毒扫描守护程序使用.