Archive:Python 3.2 socket Multicast

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

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.