Portál AbcLinuxu, 24. dubna 2024 12:02


Dotaz: Odpoved na multicast

23.7.2014 00:29 pp
Odpoved na multicast
Přečteno: 247×
Odpovědět | Admin

Zdravim,

pokusam sa opravit UPnP klienta a zistil som zaujimavu vlastnost (alebo bug?) - ako ju obist?

Najskor myslienka pre normalnych ludi: paket sa posle z 192.168.1.10 na 239.255.255.250 (multicast). Tento paket obdrzi router a odpovie unicastom z 192.168.1.1 na 192.168.1.10. Problem je, ze na 192.168.1.10 uz paket v programe neprecitam, aj ked ho podla Wiresharku dostanem.

Kedze je program pomerne hnusny, zapisem to skoro-pseudokodom:

sock = socket(PF_INET, SOCK_DGRAM, 0);
bind(sock, [AF_INET, PORT, INADDR_ANY]);
sendto(sock, buffer, n, 0, inet_addr("239.255.255.250"));
fds[0].fd = sock;
fds[0].events = POLLIN;
n = poll(fds, 1, timeout);

 

Tu nefunguje prijatie unicastovej odpovede (do programu - kernel odpoved dostane). Je pritom zaujimave, ze ked pouzijem unicastovu IP adresu v sendto, tj. ked dotaz mierim na 192.168.1.1, tak odpoved do programu po spravnosti dostanem. Odpoved sa pritom vobec nelisi.

Kde je chyba? Preco nedostavam odpoved, ktoru cakam?

Vdaka

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.7.2014 14:35 Sten
Rozbalit Rozbalit vše Re: Odpoved na multicast
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejsem si u multicastu jistý, ale u unicastu platí, že sockety probíhajících komunikací jsou identifikovány pomocí (protokol, vzdálený (IP, port), lokální (IP, port)). Příchozí paket ale má jinou adresu, jádro jej tak nedokáže přiřadit tomu otevřenému socketu a zahodí jej (je to UDP, o zahození se odesílatel neinformuje). Pokud chcete na multicast umožnit unicastovou odpověď, potřebujete naslouchat na příslušném portu pomocí listen (a otevřít ten port ve firewallu).
23.7.2014 16:05 pp
Rozbalit Rozbalit vše Re: Odpoved na multicast

Ten listen nejde prave preto, lebo je to UDP. Pre istotu som to skusil a vracia mi to -1, errno = 95 (EOPNOTSUPP). To je v manuali vysvetlene: The socket is not of a type that supports the listen() operation.

Diky za odpoved, ale zda sa, ze tu cesta nevedie.

Fuky avatar 23.7.2014 17:38 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Odpoved na multicast
Přílohy:

Na UPD paket se čeká např. pomocí recvfrom().

V příloze máš ukázku UDP klienta/serveru a ukázku multicast vysílače/přijímače.

Fuky avatar 23.7.2014 17:33 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Odpoved na multicast
Odpovědět | | Sbalit | Link | Blokovat | Admin

Podle mě tvůj klient na 192.168.1.10 paket nepřečte, protože na něj nečeká.

Kdyby jsi přiložil ukázkovou, co nejvíce očesanou, verzi klienta a serveru, která ti nefunguje, tak by se dalo odpovědět přesně.

-- RÁMO: psí tábor , ETriatlon: Výuka plavání
23.7.2014 22:48 pp
Rozbalit Rozbalit vše Re: Odpoved na multicast

Prepacte - uz som pripravil orezanu verziu programu a potom som porozmyslal o firewalle vyssie - nakoniec je to naozaj tym. Mal som tam povolene ESTABLISHED,RELATED a priama odpoved je OK, ale odpoved na multicast uz tam nespada.

23.7.2014 23:15 Ondrej Santiago Zajicek
Rozbalit Rozbalit vše Re: Odpoved na multicast
Ale ceka. Mezi cekanim v recvfrom() a v poll() z hlediska socketu neni moc rozdil. Samozrejme poll() po skonceni ten paket nepreda do userspace, na to je treba nasledne zavolani recvfrom(), ale paket je prijat a zarazen do prichozi fronty socketu.

Jinak na poslouchani na UDP neni treba zadna specialni funkce. Jakmile ma socket prirazeny port number (coz zajisti bind()), tak je port otevren a prijima pakety.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.