【发布时间】:2016-02-25 04:33:17
【问题描述】:
如果我想在一台 PC 上使用 (UDP) 套接字作为进程间通信机制,由于两个端点具有相同的 IP 地址,我可以设置的内容是否有限制?
我想,为了让两个进程 A 和 B 都监听同一个 IP/端口地址,SO_REUSADDR 是必要的 - 对吗?尽管这在概念上可能允许通过单个套接字进行全双工通信,但如果我尝试全双工,我还有其他问题:
- 我最终会收到我自己的传输,并且必须将它们过滤掉吗?
- 我是否会因为使用 SO_REUSEADDR 而将自己暴露于其他向我的套接字中注入虚假或恶意数据的进程... 还是仅通过使用(无连接)UDP 来面对这种可能性?
- 如果我选择改用 TCP,情况会有什么不同(在寻址/安全/限制方面)?
我相信有一个在每一端使用两个套接字的可行解决方案(一个用于A -> B 数据,一个用于B ->A 数据)...但是有一个可行的解决方案在每一端使用单个套接字?如果可能的话,每个进程使用一个全双工套接字会有什么明显的优势吗?
【问题讨论】:
-
为什么要让两个进程监听同一个端口?!
-
我为什么不呢?它在逻辑上是一个连接......尽管打算使用无连接协议。所以问题是:这是否可能,如果可能,是否可取(基于事实,而不是意见)?
-
这在逻辑上是一个连接,当然。但它在逻辑上也有两个不同的端点。为什么要让事情变得困难?
-
我并不是要让事情变得困难......只是我同时拥有本地通信(进程间)和远程通信,并且在远程端我可以在两端使用单个端口号,以及跨连接的全双工通信。本地也没有单通道和全双工,感觉不令人满意。我想知道它是否可能、不可能、可能但不值得麻烦等等。我想清楚我的想法,以便当我实施它时,以及其他人在 5 年内维护代码时,他们清楚地了解为什么事情会以这种方式完成。
-
您似乎将一个通道与一个端点混淆了。是的,你想要一个频道。正确的。但是该通道必须有两个端点。那么,为什么这些关于一个端口的东西呢?端口是连接端点。如果您希望事情清晰易懂,请以正常方式做事。不要试图变得可爱或奇怪。 “在远程端我可以在两端使用一个端口号”谁在乎呢?重要的是端点,而不是端口。每一端都有自己的端点,每个端点都有唯一的网络标识。
标签: sockets