1+ """
2+ SSDP Debug Tool which listens for SSDP packets on the network.
3+ Prints the details of the SSDP packets received.
4+
5+ """
6+
7+ import socket
8+ import threading
9+ import time
10+ import struct
11+ import select
12+
13+ class SSDPClient :
14+ def __init__ (self , multicast_group = '239.255.255.250' , multicast_port = 1900 , interface_ip = '0.0.0.0' ):
15+ self .multicast_group = multicast_group
16+ self .multicast_port = multicast_port
17+ self .interface_ip = interface_ip
18+ self .sock = socket .socket (socket .AF_INET , socket .SOCK_DGRAM , socket .IPPROTO_UDP )
19+ self .sock .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
20+ self .sock .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEPORT , 1 ) # Allow multiple bindings
21+ self .sock .bind ((self .interface_ip , self .multicast_port ))
22+
23+ # Join the multicast group
24+ mreq = struct .pack ("4sl" , socket .inet_aton (self .multicast_group ), socket .INADDR_ANY )
25+ self .sock .setsockopt (socket .IPPROTO_IP , socket .IP_ADD_MEMBERSHIP , mreq )
26+
27+ self .sock .setsockopt (socket .IPPROTO_IP , socket .IP_MULTICAST_TTL , 2 )
28+ self .running = True
29+ self .thread = threading .Thread (target = self .listen )
30+ self .thread .start ()
31+
32+ def listen (self ):
33+ while self .running :
34+ try :
35+ data , addr = self .sock .recvfrom (1024 )
36+ self .handle_ssdp_packet (data , addr )
37+ except Exception as e :
38+ print (f"Error receiving SSDP packet: { e } " )
39+
40+ def handle_ssdp_packet (self , data , addr ):
41+ print (f"Received SSDP packet from { addr } : { data } " )
42+
43+ def stop (self ):
44+ self .running = False
45+ self .sock .close ()
46+ self .thread .join ()
47+
48+ def main ():
49+ ssdp_client = SSDPClient ()
50+ try :
51+ print ("Listening for SSDP packets..." )
52+ while True :
53+ time .sleep (1 )
54+ except KeyboardInterrupt :
55+ print ("Stopping SSDP client..." )
56+ ssdp_client .stop ()
57+
58+ if __name__ == "__main__" :
59+ main ()
60+ else :
61+ print ("This script is intended to be run directly, not imported as a module." )
62+ print ("Run it using: python ssdp_client.py" )
63+ exit (1 )
0 commit comments