当前位置: 首页 > 知识库问答 >
问题:

在远程服务器和客户端之间使用UDP

宗政永望
2023-03-14

我目前正在做一个项目,需要一个UDP通信之间的服务器亚马逊法兰克福)和几个主机(Arduino)。我需要能够发送JSON数据从服务器到主机通过UDP,它需要实时工作(时间是一个真正的限制在这里)。此外,主机将定期与服务器通话,通知服务器其状态。

我面临的问题是,虽然我可以ping服务器,但当我创建带有端口的UDP套接字时,我会得到这个错误(对于任何端口):

errno99:无法分配请求的地址

我也相信,由于主机在不同的国家,我只能得到路由器的IP。主机将提供给用户,因此无法手动更改用户的路由器。我需要使用可以通过代码处理这些内容的东西。

我一直在搜索打孔和其他技术。我不知道什么更适合我的情况。抱歉,我缺乏网络信息,任何帮助或指导“阅读或搜索这些技术”不胜感激。

此代码在服务器上运行:

 import socket
 import time
 #Host's public IP
 UDP_IP_ADDRESS = "178.243.98.86"
 UDP_PORT_NO = 13000
 Destination = (UDP_IP_ADDRESS,UDP_PORT_NO)
 Message = "Hello, Server"
 senderSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 while True:
     senderSock.sendto(Message, Destination)
     time.sleep(1);

这段代码在我的机器上运行:

 import socket
 #Server's public IP
 UDP_IP_ADDRESS = "172.31.46.111"
 UDP_PORT_NO = 13000
 recieverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 recieverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
 while True:
     data, addr = recieverSock.recvfrom(1024)
     print "Message: ", data

共有2个答案

邢炯
2023-03-14

您似乎还在服务器上打开了一个 tcp 套接字,并通过 udp 套接字从客户端连接到它。这是故意的吗?

  • GSN
司浩壤
2023-03-14
# Host's public IP
UDP_IP_ADDRESS = "178.243.98.86"

您不能依赖178.243.98.86。您的arduinos位于一个或多个NAT之后。使用NAT,当数据包离开网络时,您的数据包源地址和/或目标地址(很可能还有端口)会被重写。当这种转换发生时,负责NAT的设备会记住这种转换,但只在有限的时间内记住。该周期通常默认为24小时。

为了克服这个问题,由客户端发起与服务器的对话。在您的协议中引入一种新的消息类型,例如嘿,是我,客户端 #34。服务器应在一段时间(如小时)内将收到的消息的源 IP 和端口与客户端 #34 相关联。

在这种情况下,服务器将套接字绑定到地址和端口以及客户端。注意嘿,是我,通过UDP发送的客户端#34没有加密,非常容易受到记录和重放攻击。我认为紧急系统应该加密

# Server's public IP
UDP_IP_ADDRESS = "172.31.46.111"

172.31.46.111不能是服务器的公共IP,因为它是来自IPv4私有空间的地址。您可能想说“主机的私有地址”。绑定到这样的地址是有意义的。您很可能会出错,因为您错误地确定了主机的IP地址。

有几种方法可以获得正确的IP。如果你使用DHCP(如果你从未考虑过在你的SOHO中使用什么IP,你会使用它),登录到你最近的路由器的管理界面并检查DCHP池。或者,Linux和Windows也有终端命令来做同样的事情。对于Arduino,你可能已经给它分配了一个静态地址。如果有,绑定到它。

 类似资料:
  • 问题内容: 简而言之,我有一个独立的ES主实例和一个在我的Java应用程序中创建的客户端节点。如果在客户端节点之前启动了独立ES实例,则客户端节点会正确发现独立ES实例。 我面临的问题是-如果由于某种原因,客户端节点在独立ES实例之前启动,我会看到“ MasterNotDiscoveredException”,这也是可预期的。但是,即使启动独立的ES实例后,我仍然会看到相同的异常。我应该更改一些配

  • 问题内容: 我用Node.js运行一个简单的http服务器: 我的index.html文件: 现在,我想在我的index.html文件中打印服务器端变量:temp。但是我不知道该怎么做。 也许有人可以帮助我从服务器到客户端交换变量。 问题答案: 正如您可以在@WebServer的答案中看到的那样,节点中有多种模板引擎。 我想给你一个使用其中一个的例子-EJS: 首先安装它: server.js:

  • 编辑:最后,问题似乎来自io.emit()中缺少第二个参数。现在它起作用了,非常感谢:)

  • 问题内容: 这是我正在从事的项目的一部分。我有两个桌面Java应用程序,一个运行在服务器上(具有真实IP),另一个运行在客户端上。我只想从连接到服务器应用程序的网络摄像头流式传输实时视频,然后在客户端应用程序上播放它。我想从多个摄像机进行流式传输。 我一直在寻找Xuggler,JMF,Red5,VLCj之间的日子。我只是不知道应该从哪里开始,因为我刚接触编程中的媒体。 我从哪里开始有什么想法? 提

  • 我有一个java服务器应用程序,可以通过与多个客户端通信。在这个通道上,客户端发送请求,服务器发送应答。现在我想添加一个功能,服务器可以将文件发送到客户端。我不想通过用于通信的套接字发送,所以在一个客户端和一个服务器之间使用更多套接字是个好主意吗?如果是,如何处理?我用过这样的东西吗? 还是有更好的办法?

  • 我必须用JS制作一个应用程序,用AES编码一条消息,并通过AJAX将其传递给服务器。然后,服务器会启动并使用Java对消息进行解码。 我的问题是:如何在JS中加密消息,并使用AES在Java中解密它?知道java和js之间的通信已经通过Web服务建立 客户端,我使用Crypto JS库(http://code.google.com/p/crypto-js/)。服务器端我使用Java提供的Ciphe