【问题标题】:What's the difference between pipes and sockets?管道和套接字有什么区别?
【发布时间】:2013-09-05 06:14:22
【问题描述】:

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

【问题讨论】:

    标签: networking tcp network-programming


    【解决方案1】:

    管道和套接字之间有什么区别,何时/如何选择一个而不是另一个?

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

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

    用法

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

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

    【讨论】:

      【解决方案2】:

      要完成 Mike 给出的答案,重要的是要提到 UNIX 域套接字的存在,它在任何 POSIX 兼容的操作系统上都可用。尽管在使用语义方面与“普通”互联网套接字非常相似,但它们纯粹是机器本地的(当然互联网套接字也可以在本地工作),因此几乎表现得像管道。几乎,因为 UNIX 管道根据定义是单向的:

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-28
        • 2018-08-25
        • 2018-05-09
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-21
        相关资源
        最近更新 更多