码迷,mamicode.com
首页 > 编程语言 > 详细

python实现多播数据的发送和接收

时间:2014-12-30 20:32:46      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

在项目中,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捕抓到的数据包如下:

技术分享

多播客户端用于接收多播服务器发送的多播包,其代码如下:

#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

技术分享 

多播客户端代码的关键是通过(socket.IP_ADD_MEMBERSHIP)把自己加入多播组以及监听在多播服务器指定的多播端口(MCAST_PORT),此外,多播服务器的目标地址必须是一个有效的多播地址,而不能是单播地址,比如:(localhost / INADDR_ANY / any valid IP)。

python实现多播数据的发送和接收

标签:

原文地址:http://www.cnblogs.com/fishou/p/4194316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!