管道和插座有什么区别?

时间:2013-09-02 07:49:45

标签: networking tcp network-programming

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

2 个答案:

答案 0 :(得分:65)

  

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

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

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

用法

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

顺便说一句,您可以使用netcatsocat将套接字加入管道。

答案 1 :(得分:20)

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

  

管道和FIFO(也称为命名管道)提供单向   进程间通信通道。管道具有读取结束和写入   结束。可以从读取中读取写入管道写入端的数据   管道的尽头。 (摘自man page pipe(7)

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