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

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

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

数据发送 sender:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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下内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部