一个或两个插槽,用于单个主机

时间:2016-02-25 04:33:17

标签: sockets

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

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

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

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

1 个答案:

答案 0 :(得分:0)

这个问题来自误解。这种误解源于读取具有不同值的receivePortsendPort等变量名称,并将它们读取为具有到本地端口的隐式链接。这可能会使一个人(错误地)相信正在使用两个插座,或者必须使用 - 一个用于发送,一个用于接收。这是错误的 - 只需要一个插槽(在每一端)。

如果使用变量来引用单个主机上的端口,最好将它们命名为明确表示一个是local或者与#34;这个"进程,另一个是remotepeer,并且属于不同进程的地址,尽管它位于同一本地主机上。然后应该更清楚的是,像任何套接字一样,它完全可能支持单个端口号的单个套接字的发送和接收。

在这种情况下(同一主机上的进程间通信必然使用每端单个套接字的不同端口号)所有其他问题(SO_REUSEADDRTCP vs UDP因接受误解而引起的注意力分散。