我正在尝试将带有图像的UDP数据包发送给我的NAT背后的朋友。他转发了接收端口,但数据包未使用我们的python代码到达。但是,尽管如此,当使用测试代码时,数据包确实到达了,并且包含IPaddr和PORT的元组相同。
注意:没有触发任何异常,它只是卡在recvfrom
中,因为没有什么可读取的
这是我用来测试数据包是否到达并正常工作的示例代码:
import socket
IPADDR = '88.1.231.55'
PORTNUM = 8043
PACKETDATA = 'TEEEESSTT'.encode('ascii')
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.sendto(PACKETDATA, (IPADDR, PORTNUM))
s.close()
UDP类的初始化:
def __init__ (self, ip_dest, port_dest, port_src, tcp):
self.TCP = tcp
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.dest = (str(ip_dest), int(port_dest))
self.socket.bind(('', port_src))
self.receiveVideoThread = threading.Thread(target=self.receive_video)
self.receiveVideoThread.setDaemon(True)
self.receiveVideoThread.start()
...........
发送图像:
def send_video(self, frame):
if not self.TCP.pauseCall or not self.TCP.endCall:
try:
header = "{}#{}#{}#{}#".format(self.counter, time.time(), '640x480', self.fps).encode("utf-8")
ratio = self.get_compress_ratio(self.fps_friend)
frame = self.rescale_by_height(frame, 320)
self.frame_sent = frame
frame_compressed = self.compress(frame, 1)
self.socket.sendto(header + frame_compressed, self.dest)
self.counter += 1
except Exception as e:
print(e)
return
并收到:
def receive_video(self):
while not self.TCP.endCall or not self.TCP.pauseCall:
try:
data, _ = self.socket.recvfrom(200)
datagram = data.split(b'#', 4)
self.fps_friend = datagram[3]
........
使用我们的代码时,数据包显示在Wireshark上,但从未到达。使用示例代码时,数据包确实到达了。
这与数据包的大小有关吗?我尝试最大程度地压缩图像,所以现在整个UDP数据包的大小约为5KB