我原来的问题措辞不好,我也不知道自己在做什么。它留在下面供参考。
我原来问题的真正答案是我不需要使用connect()并使用recvfrom()和sendto()来从多个主机发送/接收。这似乎运作良好,谢谢。
我有一个相关的问题,我希望有人能够回答。使用UDP,我可以在同一个接口和端口上有多个进程吗?我以为我记得看到可以完成的某个地方,但缺点是所有进程都会从套接字接收所有数据。这就足够了。
我看了一下,还有SO_REUSEADDR选项。在某些UNIX实现中,还有SO_REUSEPORT,但在Windows中并不存在。我试图了解如何使用SO_REUSEADDR。我看到了一些问题,但是,并没有专门解决我的问题,即是否可以在多个进程可以使用相同的UDP接口和端口的情况下完成。
有人可以澄清吗?感谢。
原始问题:
我试图搜索一些类似的主题,例如" UDP C套接字:多个套接字共享单个端口"情况并非如此。
所以,这是要求。这是客户驱动的规范,并且他们不愿意接受替代方案。所以,如果你说我可能应该使用TCP或其他方法,你可能是对的,但客户没有表现出灵活性。
客户在该领域拥有数千台设备。我们的规范称支持35,000台设备,但他们表示实际上至少在相当长一段时间内它可能只有大约10,000台设备。我们可以讨论带宽问题,但是,目前,这不是我的担忧。它根据需要建立套接字连接。
基本上,他们希望所有连接使用相同的端口号,以便仅通过IP地址区分对话。这就是问题所在。
我们将提供的服务器是Windows 2012 R2。当然使用Winsock。我已经看到了一些对setsockopt()的引用,你可以在其中指定SO_REUSEADDR。我已经看到一些UNIX对SO_REUSEPORT选项的引用,但是,我没有在MSDN中看到那个,所以,也许Windows没有那个。但是,看起来SO_REUSEADDR可能会起作用。
我在SO_REUSEADDR上看到的文字表明,如果你有多个应用程序使用相同的端口,他们都将获得该端口的所有消息,并且各个应用程序需要确定哪些消息确实适用于哪个应用程序
好吧,它不会是多个应用程序,它将是一个应用程序,连接到多个服务器。但是,在进一步说明之前,我想我不太清楚为什么套接字层基本上没有区分IP和端口组合的会话。就像我有一个套接字在端口5000上与192.168.1.1通信,另一个套接字在端口5000上与192.168.1.2通信,即使它们是相同的端口号,它们也应该可以通过IP地址区分。
事实上,这就是服务器应用程序的工作方式,对吧?服务器可以接受多个客户端,例如端口80(多个Web客户端),并且套接字层通过IP地址将消息分派到正确的会话。但是,对于我的客户端应用程序,似乎并没有这样做。仅使用基本套接字代码,第二次连接的尝试将失败并显示正在使用的端口错误。并且,看起来如果我使用REUSE选项,即使服务器具有不同的IP地址,两个套接字也将从两个服务器获取数据。我明白这是对的,还是我完全脱离了基础?我还没有尝试过编码,我只是阅读了一些消息,说这是共享端口的工作原理。
或者,有没有办法去捎带"在插座上添加其他服务器?然后,我可以得到一个插槽,但是,我可以从多个服务器获取数据,然后我可以通过IP地址区分,假设我可以提取源IP。
我想我只是说,在我看来,我应该能够(在我的简单的两个服务器示例中)使用两个套接字来执行此操作,每个套接字只从一个服务器获取数据。或者,使用一个从两个服务器获取数据的套接字。我必须有两个套接字才能从两个服务器获取数据,这似乎是不合理的。
当我们扩展到10,000到35,000台服务器时,这当然会成为一个更大的问题。我真的需要35,000个套接字,每个套接字看到所有35,000个服务器的所有数据吗?
但是,唉,如果必须的话,我必须这样做。在任何情况下,是否有样本代码以任何可行的方式执行此类操作?谢谢你的帮助!
答案 0 :(得分:1)
您只需要一个端口和一个插槽。别打电话给connect()
。然后,您可以发送到任何可到达的UDP目标端口,并从中接收。
话虽如此,您的客户似乎错误地设计了产品。没有必要只使用一个客户端端口。所需的只是服务器重播回收到请求的端口,并通过address
recvfrom().
参数获取每个请求的信息。
我也想知道你是否完全误解了这个要求。所有设备似乎更有可能在同一个UDP端口上监听,并且您提到的客户端端口约束根本不存在。