Archive:Python 3.2 socket Multicast
De Centre de Ressources Numériques - Labomedia
Réception de Multicast dans Blender 2.6 en python 3.2
import GameLogic as gl import socket # OSC.py est dans un dossier OSC3, ce dossier est dans le dossier du fichier blend from OSC3.OSC import decodeOSC from time import sleep def main(): ip = gl.ip_multicast buffer_size = 1024 port = gl.port_in connect_blender(ip, port, buffer_size) get_OSC_data(buffer_size) def connect_blender(ip, port, buffer_size): # Connexion de Blender en Multicast if not gl.connected : gl.connected = True ANY = "0.0.0.0" MCAST_ADDR = "224.0.0.14" MCAST_PORT = 18888 #create a UDP socket gl.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) #allow multiple sockets to use the same PORT number gl.sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #Bind to the port that we know will receive multicast data gl.sock.bind((ANY,MCAST_PORT)) #tell the kernel that we are a multicast socket gl.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 = gl.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(MCAST_ADDR) + socket.inet_aton(ANY)) gl.sock.setblocking(0) # This option doesn't work ! gl.sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, buffer_size) def get_OSC_data(buffer_size): # Si blender est connecté, récupération des messages OSC if gl.connected : try: raw_data = gl.sock.recv(buffer_size) data = decodeOSC(raw_data) recup_messages(data) except socket.error: gl.socket_failed += 1 pass
L'option socket.SOL_SOCKET, socket.SO_RCVBUF, buffer_size ne fonctionne pas. Le serveur doit envoyer moins vite que ne lit Blender, sinon il y a de la latence.
Les variables attibut du GameLogic sont initialisées dans un script init.py lancé une seule fois au tout début du jeu. Voir Muti Pass For Freedom.