Отправка пакетов UDP через Интернет работает только наполовину - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь отправить 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 составляет ~ 5 КБ

...