python實現多播數據的發送和接收


在項目中,YS私有協議用到多播技術,在驗證其安全特性時用到python去發送多播包,在此做個記錄。

多播服務器用於向多播組發送多播數據包,其實現代碼如下:

#coding:utf-8,
import socket 
import time

ANY = '0.0.0.0'
SENDERPORT=1501 
MCAST_ADDR = '224.168.2.9'
MCAST_PORT = 1600

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
sock.bind((ANY,SENDERPORT)) #綁定發送端口到SENDERPORT,即此例的發送端口為1501
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) #設置使用多播發送
while 1: 
    time.sleep(10)
    sock.sendto('Hello World', (MCAST_ADDR,MCAST_PORT) ); #將'hello world'發送到多播地址的指定端口,屬於這個多播組的成員都可以收到這個信息

通過wireshark捕抓到的數據包如下:

image

多播客戶端用於接收多播服務器發送的多播包,其代碼如下:

#coding:utf-8,
import socket 
import time

ANY = '0.0.0.0'
MCAST_ADDR = '224.168.2.9'
MCAST_PORT = 1600 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) #創建UDP socket
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #允許端口復用 
sock.bind((ANY,MCAST_PORT)) #綁定監聽多播數據包的端口
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) #告訴內核這是一個多播類型的socket
status = sock.setsockopt(socket.IPPROTO_IP,  #告訴內核把自己加入指定的多播組,組地址由第三個參數指定
socket.IP_ADD_MEMBERSHIP, 
socket.inet_aton(MCAST_ADDR) + socket.inet_aton(ANY));

sock.setblocking(0) 
ts = time.time() 
while 1: 
    try: 
        data, addr = sock.recvfrom(1024) 
    except socket.error, e: 
        pass 
    else: 
        print "We got data!"
        print "FROM: ", addr 
        print "DATA: ", data

image 

多播客戶端代碼的關鍵是通過(socket.IP_ADD_MEMBERSHIP)把自己加入多播組以及監聽在多播服務器指定的多播端口(MCAST_PORT),此外,多播服務器的目標地址必須是一個有效的多播地址,而不能是單播地址,比如:(localhost / INADDR_ANY / any valid IP)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM