Portál AbcLinuxu, 12. května 2025 04:15
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
listen
(a otevřít ten port ve firewallu).
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.
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.
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ě.
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.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.