servidor e cliente multicast em python

Se você é só um leitor regular do blog e não sabe do que se trata, dê uma lida sobre detalhes do Multicast no Wikipedia. Se você chegou aqui por uma busca no google ou algo do tipo, deu sorte – achou o que estava procurando.

Abaixo, o código do servidor mcsrv.py

#!/usr/bin/env python
# coding: utf-8
# mcsrv.py 20080524 AF

import sys, struct, socket

def mcast_server(addr, port):
    fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # bind udp port
    fd.bind(('', port))

    # set mcast group
    mreq = struct.pack('4sl', socket.inet_aton(addr), socket.INADDR_ANY)
    fd.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    try:
        while 1:
            data, addr = fd.recvfrom(1024)
            print '%s bytes from %s: %s' % (len(data), addr, data)
    except KeyboardInterrupt:
        print 'done'
        sys.exit(0)

if __name__ == '__main__':
    try:
        addr = sys.argv[1]
        port = int(sys.argv[2])
    except IndexError:
        addr = '225.0.0.1'
        port = 1905
    finally:
        print 'running server on %s:%d' % (addr, port)
        mcast_server(addr, port)

Pra quem já escreveu um servidor multicast em C, não vai notar muita diferença. É um setsockopt com a struct mreq preenchida com o IP de classe D.

O cliente, nem se fala. É um cliente genérico UDP que nem sabe que o destinatário é um IP multicast. Ele envia o pacote como faz pra qualquer outro endereço IP e porta.

Abaixo, o cliente udpcli.py

#!/usr/bin/env python
# coding: utf-8
# udpcli.py 20080524 AF

import sys, socket

if __name__ == '__main__':
    try:
        addr = sys.argv[1]
        port = int(sys.argv[2])
        buff = sys.argv[3]
    except IndexError:
        print 'use: %s addr port buff' % sys.argv[0]
        sys.exit(1)

    fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    fd.sendto(buff, (addr, port))

Pra fazer o teste, rode o servidor em N máquinas da mesma rede lógica e cada mensagem do cliente irá aparecer em todos os servidores. Exemplo:

$ python udpcli.py 225.0.0.1 1905 "foo bar"
Anúncios


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s