我是靠谱客的博主 俏皮小蜜蜂,最近开发中收集的这篇文章主要介绍通过python下的socket实现组播数据的发送和接收,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

关于网络组播的解释我不在此详述了,想了解的直接百娘就可以了,本人也是新手,研究了几天Python的组播编程后,目前终于成功的解决了自己找的各种麻烦,所以现在总结如下:

python实现socket组播有N种写法,我现在只给出自己认为比较妥当的写法。

数据发送 sender:

import time
import struct
from socket import *

SENDERIP = '192.168.0.116'#本地ip
SENDERPORT = 1501#本地接口
MYPORT = 1234#发送数据到该端口
MYGROUP = '224.1.1.1'#组播组
MYTTL = 255 # 发送数据的TTL值

def sender():
    s = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP)
    s.bind((SENDERIP,SENDERPORT))
    # Set Time-to-live (optional)
    ttl_bin = struct.pack('@i', MYTTL)
    s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl_bin)
    status = s.setsockopt(IPPROTO_IP,
        IP_ADD_MEMBERSHIP,
        inet_aton(MYGROUP) + inet_aton(SENDERIP))#加入到组播组
    while True:
        data = 'cisco'
        s.sendto(data + '', (MYGROUP, MYPORT))
        print "send data ok !"
        time.sleep(10)

if __name__ == "__main__":
    sender()

接收数据 receiver:

import time
import socket

SENDERIP = '192.168.0.116'
MYPORT = 1234
MYGROUP = '224.1.1.1'

def receiver():
    #create a UDP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    #allow multiple sockets to use the same PORT number
    sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    #Bind to the port that we know will receive multicast data
    sock.bind((SENDERIP,MYPORT))
    #tell the kernel that we are a multicast socket
    #sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
    #Tell the kernel that we want to add ourselves to a multicast group
    #The address for the multicast group is the third param
    status = sock.setsockopt(socket.IPPROTO_IP,
        socket.IP_ADD_MEMBERSHIP,
        socket.inet_aton(MYGROUP) + socket.inet_aton(SENDERIP));

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

            print "TIME:" , time.time()
            print "FROM: ", addr
            print "DATA: ", data
if __name__ == "__main__":

    receiver()

不出意外的话,你按照以上两个脚本测试,在windows下是没有问题。

可以实现的模式有:

windows  发数据 ,windows 接数据

Linux(如:CentOS) 发数据 ,windows 接数据

但是,linux接收数据,就不灵了。反正我试验好久,也没能成功。

ps:我亲自试验过,linux下用tcpdump抓包,是可以抓到的。

解决方法:

将receiver脚本的sock.bind((SENDERIP,MYPORT))(也就是绑定IP)更改为空或者“0.0.0.0”,然后你再试一下,基本上就全都通了。

网上的解释是,如果绑定为“0.0.0.0”,则表明是所有网卡的数据都可以接收到,但是我有点儿糊涂的地方是,我就一个网卡,而且只有个IP,难道我接受的数据不是通过这个IP接收到的?怪哉!

如果有大牛知道原因,请告知,谢谢!





最后

以上就是俏皮小蜜蜂为你收集整理的通过python下的socket实现组播数据的发送和接收的全部内容,希望文章能够帮你解决通过python下的socket实现组播数据的发送和接收所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部