通过Internet发送UDP数据包仅能完成一半

时间:2019-05-12 22:42:15

标签: python networking video stream udp

我正在尝试将带有图像的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

0 个答案:

没有答案