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 进行响应,这就是为什么我的客户端案例正在侦听该端口..所以客户端必须侦听另一个端口,而不是它发送到的相同.. 上面的代码就像一个回显服务器。并且需要绑定服务器地址。当然,你可以切换recvfromsendto,如果你想表现得像个客户…… 所以我必须执行的唯一更改是... -- 请查看更新的代码 -- 这导致异常被捕获,并且打印无法创建套接字。 我认为这是因为这台机器上的这个端口上已经有一个套接字在运行。

以上是关于UDP 连接没有收到来自服务器的任何回复 - Python(也可能是使用 boost 的 c++)的主要内容,如果未能解决你的问题,请参考以下文章

袜子 5 UDP 连接

D语言:UDP客户端没有收到回复

当UDP协议客户端给TCP协议服务器发数据会发生什么

Android手机只开启Wifi,但是不连接任何一个路由器,能不能收到路由器转发的UDP广播数据包,如何现实?

为啥 ZeroMQ 服务器没有收到来自客户端的任何请求?

WSA UDP 套接字无法重用,因为它强制关闭连接