【问题标题】:One socket or two for inter-process communication on single host一个或两个套接字,用于单个主机上的进程间通信
【发布时间】:2016-02-25 04:33:17
【问题描述】:

如果我想在一台 PC 上使用 (UDP) 套接字作为进程间通信机制,由于两个端点具有相同的 IP 地址,我可以设置的内容是否有限制?

我想,为了让两个进程 AB 都监听同一个 IP/端口地址,SO_REUSADDR 是必要的 - 对吗?尽管这在概念上可能允许通过单个套接字进行全双工通信,但如果我尝试全双工,我还有其他问题:

  • 我最终会收到我自己的传输,并且必须将它们过滤掉吗?
  • 我是否会因为使用 SO_REUSEADDR 而将自己暴露于其他向我的套接字中注入虚假或恶意数据的进程... 还是仅通过使用(无连接)UDP 来面对这种可能性?
  • 如果我选择改用 TCP,情况会有什么不同(在寻址/安全/限制方面)?

我相信有一个在每一端使用两个套接字的可行解决方案(一个用于A -> B 数据,一个用于B ->A 数据)...但是有一个可行的解决方案在每一端使用单个套接字?如果可能的话,每个进程使用一个全双工套接字会有什么明显的优势吗?

【问题讨论】:

  • 为什么要让两个进程监听同一个端口?!
  • 我为什么不呢?它在逻辑上是一个连接......尽管打算使用无连接协议。所以问题是:这是否可能,如果可能,是否可取(基于事实,而不是意见)?
  • 这在逻辑上是一个连接,当然。但它在逻辑上也有两个不同的端点。为什么要让事情变得困难?
  • 我并不是要让事情变得困难......只是我同时拥有本地通信(进程间)和远程通信,并且在远程端我可以在两端使用单个端口号,以及跨连接的全双工通信。本地也没有单通道和全双工,感觉不令人满意。我想知道它是否可能、不可能、可能但不值得麻烦等等。我想清楚我的想法,以便当我实施它时,以及其他人在 5 年内维护代码时,他们清楚地了解为什么事情会以这种方式完成。
  • 您似乎将一个通道与一个端点混淆了。是的,你想要一个频道。正确的。但是该通道必须有两个端点。那么,为什么这些关于一个端口的东西呢?端口是连接端点。如果您希望事情清晰易懂,请以正常方式做事。不要试图变得可爱或奇怪。 “在远程端我可以在两端使用一个端口号”谁在乎呢?重要的是端点,而不是端口。每一端都有自己的端点,每个端点都有唯一的网络标识。

标签: sockets


【解决方案1】:

问题源于误解。误解来自于读取具有不同值的变量名称(如receivePortsendPort),并且将它们读取为好像它们具有到本地端套接字的隐式链接一样。这可能使人(错误地)认为正在使用或必须使用两个套接字 - 一个用于发送,一个用于接收。这是错误的 - 只需要一个套接字(在每一端)。

如果使用变量来引用单个主机上的端口,最好将它们命名为明确一个是local或属于“this”进程,另一个是remote或@987654325 @ 并且与不同进程的地址有关,尽管位于同一本地主机上。那么应该更清楚的是,像任何套接字一样,它完全有可能支持从具有单个端口号的单个套接字发送和接收。

在这种情况下(同一主机上的进程间通信必须在每一端为单个套接字使用不同的端口号)所有其他问题(SO_REUSEADDRTCPUDP 并接收自己的传输)是误解引起的分心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多