日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

转-Multicast server and client in Python

發(fā)布時(shí)間:2024/4/14 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转-Multicast server and client in Python 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

FROM:http://chaos.weblogs.us/archives/164
Python has complete support for sockets. Some of the APIs though have a different signature than the POSIX equivalents. It is therefore possible to write multicast servers and clients in Python. Multicasting is the ability to send data to select set of hosts. Broadcasting in a network is to send data to all the hosts, unicast is when data is transfered between two hosts (typical one-one communication). Multicasting is the ability to send data to a multicast address and the clients are provided the data. Now that an introduction to multicasting is complete, lets look at how to write a simple multicast server and a multicast client.
Multicast servers are written very similar to a standard unicast server, its the clients who have a slightly different code. The major change is made in setting socket options on the socket transmitting and receiving data.

The server code looks like this:
################################################################
import socket, 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)
#The sender is bound on (0.0.0.0:1501)
sock.bind((ANY,SENDERPORT))
#Tell the kernel that we want to multicast and that the data is sent to everyone (255 is the level of multicasting)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
while 1:
??? time.sleep(10)
??? #send the data "hello, world" to the multicast addr: port
??? #Any subscribers to the multicast address will receive this data
??? sock.sendto("Hello World", (MCAST_ADDR,MCAST_PORT));
################################################################
The TTL field of 255 indicates that the data is unrestricted in scope.

The corresponding client code to receive the data being transmitted by the sender will look like this:
################################################################
import socket, time

ANY = "0.0.0.0"
MCAST_ADDR = "224.168.2.9"
MCAST_PORT = 1600
#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((ANY,MCAST_PORT))
#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(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
################################################################
The import part of the client code is the setsockopt for multicast socket and to add the socket to a multicast group (socket.IP_ADD_MEMBERSHIP). Also note that the socket is bound to ANY:MCAST_PORT. The server sends data to the multicast address and on the client side, the socket that is bound to the multicast port subscribes to the multicast group and receives data on the MCAST_PORT. It is important the client code bind itself to the MCAST_PORT to receive data from the multicast address. Another important thing to note is the MCAST_ADDR. This address should be a valid multicast address, and not a unicast (localhost / INADDR_ANY / any valid IP).


TTL???? Scope
----------------------------------------------------------------------
?? 0??? Restricted to the same host. Won't be output by any interface.
?? 1??? Restricted to the same subnet. Won't be forwarded by a router. <If not otherwise specified, multicast datagrams are sent with a default value of 1, to prevent them to be forwarded beyond the local network.
?<32???????? Restricted to the same site, organization or department.
?<64 Restricted to the same region.
<128 Restricted to the same continent.
<255 Unrestricted in scope. Global.


224.0.1.0到238.255.255.255為用戶(hù)可用的組播地址,在全網(wǎng)范圍內(nèi)有效。其中232.0.0.0/8為SSM組地址,而其余則屬于ASM組地址。

http://www.h3c.com.cn/Products___Technology/Technology/Group_Management/Other_technology/Technology_book/200803/336048_30003_0.htm
根據(jù)接收者對(duì)組播源處理方式的不同,組播模型分為以下兩大類(lèi):
ASM模型:即任意源組播模型。在ASM模型中,任一發(fā)送者都可作為組播源向某組播組地址發(fā)送組播信息,接收者通過(guò)加入由該組播組地址標(biāo)識(shí)的組播組以獲得發(fā)往該組播組的組播信息。在ASM模型中,接收者無(wú)法預(yù)先知道組播源的位置,但可以在任意時(shí)間加入或離開(kāi)組播組。
SSM模型:即指定信源組播模型。在現(xiàn)實(shí)生活中,用戶(hù)可能只對(duì)某些組播源發(fā)送的組播信息感興趣,而不愿接收其它源發(fā)送的信息。SSM模型為用戶(hù)提供了一種能夠在客戶(hù)端指定組播源的傳輸服務(wù)。

轉(zhuǎn)載于:https://my.oschina.net/kuafu/blog/37802

總結(jié)

以上是生活随笔為你收集整理的转-Multicast server and client in Python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。