ip multicasting & python

Все о программировании под *nix
Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

ip multicasting & python

Сообщение Silos »

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

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

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

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

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

Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Сообщение 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)
на питоне.

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

я вас прошу...
по запросу "python multicast server example" - в пределах первого экрана (даже не страницы)
http://aspn.activestate.com/ASPN/Cookbo ... ipe/425975
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Сообщение Silos »

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

Ответить