Listen to UDP port already in use Python

Viewed 119

I have an application which communicates on a specific port, and I would like to listen to all UDP traffic which has this specific port as a source or destination.

Naively I try to do something like:

import socket
UDP_IP = "0.0.0.0"
UDP_PORT = my_port
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
sock.bind((UDP_IP, UDP_PORT))
while True:
    data, addr = s.recvfrom(4096)
    print("received message:", data)

however this does not work because the application in question is already bound to the port, so I get an error if I try to bind to it in my code.

My next attempt was to use scapy with something like:

from scapy.all import *
import queue

scapy.config.conf.use_pcap = True

pending_pkts = queue.Queue()

def callback(pkt):
    pending_pkts.put(pkt)

def worker():
    while True:
        pkt = pending_pkts.get()
        # I do some stuff with the packet here
        pending_pkts.task_done()

t = Thread(target=worker)
t.daemon = True
t.start()
sniff(prn=callback, filter="udp and port my_port")

The idea here was that I would stuff the packets into my queue and then do the relatively costly processing on a separate thread. While this does somewhat work, I miss something like 50% of the packets I am interested in, which is unacceptable for the project. I have seen other people running into this issue and try everything suggested (using a very specific filter, using pcap, using multiple threads to avoid costly processing holding things), but evidently this is still not fast enough since I miss so many packets.

I would greatly appreciate it if someone could point me in the right direction as to how I can get ideally 100% packet capture (doesn't need to be realtime, I can accept a couple second delay in processing if it means I get everything) on a UDP port which is already in use. Ideally I would like to stick with python, but I would be willing to also try something in C++ if someone knows of a solution.

Thanks for your time :)

0 Answers
Related