【发布时间】:2018-01-06 23:16:57
【问题描述】:
我目前正在开发一个项目,该项目需要在服务器 Amazon Frankfurt)和多个主机(Arduino)之间进行 UDP 通信。我需要能够通过 UDP 将 JSON 数据从服务器发送到主机,并且它需要实时工作(时间在这里是一个真正的限制)。此外,主机会定期与服务器通话以通知服务器其状态。
我面临的问题是,虽然我可以 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
【问题讨论】:
-
另外,您需要了解 UDP 是一种尽力而为、即发即弃的无连接协议,无法保证传送,您会丢失一些数据包,所以你需要考虑到这一点。使用 UDP 的实时协议(如 VoIP)会考虑到数据包丢失的情况,并采取措施尽量减少对应用程序的影响。
-
您能分享一下代码和整个堆栈跟踪吗?无法绑定到 IP 和端口与 NAT 问题无关。您肯定会遇到后者(除非您使用 IPv6 并且根本没有 NAT),但前者是另一回事。
-
@RonMaupin 这将是一个紧急警报系统,这就是我需要实时工作的原因。如果数据包丢失,我将多次发送相同的数据以恢复。
-
@Vovanrock2002 我尝试使用简单的服务器客户端示例,例如python wiki,并使用公共 IP。但是我没有尝试使用打孔,因为据我所知,在发送任何数据包之前,主机和服务器之间应该有一个实时连接。由于我的项目是一个紧急警告系统,我可能需要在任何未确定的时间发送警告
-
"如果数据包丢失,我将多次发送相同的数据以恢复。"我不确定 TCP 是否更合适。它将保证以正确的顺序传输数据。实时系统会理解丢失数据的发生,处理它没有所有数据的事实,然后继续前进。请求重新发送丢失的数据不是实时行为。
标签: sockets networking server udp real-time