Страница 1 из 1

ip multicasting & python

Добавлено: 08 авг 2006, 15:26
Silos
Есть sechat который рассылает udp пакеты через ip multicasting (225.0.0.1:9009).
Их неообходимо ловить на питоне.
Все бы ничего, да про multicasting в питоне я ничего не нашел.

Если проводить анологию с программированием сокетов на C, то нужные параметры устанавливаются с помощью setsockopt. В питоне есть такая функция, но только ничего не сказано в документации. Кроме Read Unix Man Pages:)

Как реализовать? Что читать?

Добавлено: 08 авг 2006, 16:02
Llama
Silos,
1) возможно функция самодокументирована
2) Если сказано читать маны, то их и надо видимо читать... Скорее всего количество,порядоки и значение параметров совпадают.

Добавлено: 08 авг 2006, 21:34
Silos
Собственно их я почитал.
Выдрал кусок кода на C:

Код: Выделить всё

 bzero((char *)&sto,sizeof(sto));
 addr.s_addr=inet_addr("225.0.0.1");
 sto.sin_family=AF_INET;
 sto.sin_port=htons(port);
 sto.sin_addr=addr;
 nlen=sizeof(sockaddr_in);
 
 int ttl=7,one=1;
 struct ip_mreq mreq;
 
 if((Socket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1)
   {
    Error(0);
   }
 
 Address.sin_family=AF_INET;
 Address.sin_port=htons(port);
 Address.sin_addr.s_addr=INADDR_ANY;
 
 if(bind(Socket,(struct sockaddr *)&Address,sizeof(Address))==-1)
   {
    Error(1);
   }
 
 if(setsockopt(Socket,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl))==-1)
   {
    Error(2);
   }
   
 bzero((char *)&mreq,sizeof(mreq));
 mreq.imr_multiaddr.s_addr=inet_addr("225.0.0.1");
 mreq.imr_interface.s_addr=INADDR_ANY;
 
 if(setsockopt(Socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))==-1)
   {
    Error(2);
   }
  
 setsockopt(Socket,SOL_SOCKET,SO_REUSEADDR,&one,sizeof(one));
Написал по анологии на pythone:

Код: Выделить всё

ost = "255.0.0.1"
port = 9009
buf = 1024
addr = (host,port)

UDPSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
UDPSock.bind(addr)
UDPSock.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, 7)
#UDPSock.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, "225.0.0.1")
UDPSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
Закоментированная строка должна добавлять мультикаст в сокет. Но этого не происходит из-за того, что я не знаю как сказать

Код: Выделить всё

 mreq.imr_multiaddr.s_addr=inet_addr("225.0.0.1");
 mreq.imr_interface.s_addr=INADDR_ANY;
 
 if(setsockopt(Socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))==-1)
на питоне.

Добавлено: 08 авг 2006, 21:57
Llama
я вас прошу...
по запросу "python multicast server example" - в пределах первого экрана (даже не страницы)
http://aspn.activestate.com/ASPN/Cookbo ... ipe/425975

Добавлено: 10 авг 2006, 11:08
Silos
Llama, спасибо!
Хоть это и не то, но это помогло http://www.bluebear.co.nz/log/2006/05/2 ... multicast/.
Теперь осталось написать обертку на C.