UDP 连接没有收到来自服务器的任何回复 - Python(也可能是使用 boost 的 c++)
Posted
技术标签:
【中文标题】UDP 连接没有收到来自服务器的任何回复 - Python(也可能是使用 boost 的 c++)【英文标题】:UDP connection do not receive any reply from server - Python (potentially also c++ using boost) 【发布时间】:2015-12-01 10:11:41 【问题描述】:我正在尝试建立与服务器的连接,并向其发送一些数据.. 问题是,如果我尝试使用此 MICHAEL SIEGENTHALER | 调试连接TCP/UDP 调试工具 这清楚地表明通信没有问题,甚至某种形式的随机输入也会导致数据输出。
但是当我尝试在python中使用相同的设置对其进行编码时,没有收到任何响应。它在发送消息后停止,我不确定它是否发送了消息,还是跳过了它?
我的服务器似乎没有收到我发送给它的消息,因此不回复.. 但有什么不同?
import socket #for sockets
import sys #for exit
# create dgram udp socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print ('Failed to create socket')
sys.exit()
host = 'localhost';
port = 5634;
while(1) :
try :
#Set the whole string
s.sendto(("-1-117230").encode('utf-8'),('10.2.140.183', 9008))
print("sent")
# receive data from client (data, addr)
d = s.recvfrom(1024)
reply = d[0]
addr = d[1]
print ('Server reply : ' + reply)
except socket.error as msg:
print ('Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
与代码有什么不同,调试工具的测试方式是什么?
我尝试使用 boost 在 c++ 中对其进行编码,但由于我遇到了同样的问题,我继续尝试使用 python 来看看这是否更有意义。
---更新了--
import socket #for sockets
import sys #for exit
# create dgram udp socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_adress = ('10.2.140.183',5634)
s.bind(server_adress)
except socket.error:
print ('Failed to create socket')
sys.exit()
while(1) :
try :
#Set the whole string
s.sendto(("-1-117230").encode('utf-8'),('10.2.140.183', 9008))
print("sent")
# receive data from client (data, addr)
d = s.recvfrom(1024)
reply = d[0]
addr = d[1]
print ('Server reply : ' + reply)
except socket.error as msg:
print ('Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
【问题讨论】:
除其他外,如果发送的数据报丢失,您的代码将永远等待。 您能否将代码作为文本而不是图片提供给我们,没有人会全部输入来尝试一下 将代码添加为文本,是的,您对它丢失的看法是对的。但这里的问题是我无法连接到它,所以添加只会重新发送,是的做同样的事情.. 【参考方案1】:您缺少binding 方法。
这是一种回显服务器:
import socket
import sys
host = ''
port = 8888
buffersize = 1
server_address = (host, port)
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
socket_UDP.bind(server_address)
while True:
data, from_address = socket_UDP.recvfrom(buffersize)
if data:
socket_UDP.sendto(bytes("b"*buffersize, "utf-8"), from_address)
socket_UDP.close()
【讨论】:
是否可以使用 python 来检索 client_adress 而不是明确说明它? Soo... 只是为了确定.. 您将 UDP 套接字绑定到服务器地址。并等待来自同一个地址的回复??这里的问题(我认为)是客户端必须能够发送到 ('10.2.140.183', 9008) = (ip,port) ,但是服务器使用另一个端口 5634 进行响应,这就是为什么我的客户端案例正在侦听该端口..所以客户端必须侦听另一个端口,而不是它发送到的相同.. 上面的代码就像一个回显服务器。并且需要绑定服务器地址。当然,你可以切换recvfrom
和sendto
,如果你想表现得像个客户……
所以我必须执行的唯一更改是... -- 请查看更新的代码 -- 这导致异常被捕获,并且打印无法创建套接字。
我认为这是因为这台机器上的这个端口上已经有一个套接字在运行。以上是关于UDP 连接没有收到来自服务器的任何回复 - Python(也可能是使用 boost 的 c++)的主要内容,如果未能解决你的问题,请参考以下文章