» »

linux c - ne sprejme UDP paketa

linux c - ne sprejme UDP paketa

slovencl ::

Pozdravljeni,

Naredil sem si en testni program za posiljanje in sprejemanje UDP paketov. Paket posljem in ga tudi dobim nazaj, vendar pa ga moj program ne sprejme, kljub temu da imam bind().
Ima kdo kaksno idejo, v cem bi bil problem?

c koda
lsof + wireshark
  • spremenil: slovencl ()

srus ::

Preberi man za recvfrom in predelaj kodo okoli recvfrom. Vsekakor si poglej vrednosti, ki jih vrača ta funkcija in errno, ki jih nastavlja.

misek ::

Uporabi ločena socket-a za server in klienta?
Poleg tega dejansko nekaj pošlji - sedaj pošlješ podatke dolžine 0?

Zgodovina sprememb…

  • spremenil: misek ()

Ahim ::

A naj to dejansko deluje da posljes paket iz 192.168.3.1 na 192.168.3.10, pricakujes pa da ga bos prejel in prebral iz socketa, bindanega na 192.168.3.1 (sicer imas nek komentar v smislu da dodas se en IP naslov na nek network interface, ampak ne poznamo tvoje mrezne konfiguracije)?

Par nasvetov:
1: Opisi mrezno konfiguracijo.

2: Opisi kaj bi rad dosegel.

3: Izberi manj konfuzne naslove (npr. .2 in .3 je bolje kot .1 in .10).

4: Loci client in server, ker je ocitno da ne gre za eno apliakcijo, ki se obojesmerno pogovarja z neko drugo, ampak gre dobesedno za dve loceni aplikaciji.

GupeM ::

Onemogoči RP filter.

Poleg točke 4 prejšnjega posta. Tudi ostale 3 točke bi bilo fino, da jih upoštevaš.

Zgodovina sprememb…

  • spremenil: GupeM ()

slovencl ::

Hvala vsem za odgovore. Sem sedaj modificiral zadevo.

Gre za komunikacijo računalnika (ip = 192.168.3.1) z data logerjem (ip = 192.168.3.10). Računalnik pošlje prazen UDP paket s porta 7789 na data logger port 7789. S tem sproži odgovor data logerja, ki pošlje podatke. Bind pri pošiljanju imam zato, da določim na katerem portu računalnik pošilja.

Obolevam... Program mi še vedno ne sprejema odgovora, ki ga dobim na isti port 7789 (paket vidim z wireshark). Ne dobim errorja na sprejemu, ker program čaka na paket, ki ga ne dobi.

Upam da je sedaj bolj razumljivo. Se komu sanja v čem je problem?

c koda

Zgodovina sprememb…

  • spremenil: slovencl ()

misek ::

Če hočeš uporabljati samo en port potem moraš imeti tudi samo en socket, ki je bindan na ta port. Tako da je tvoja originalna koda ok. In celo deluje - pravkar pognal.

Tako da preveri ali ti morda kakšen firewall blokira UDP pakete.

slovencl ::

Hvala za info. Kako pa si testiral. A si naredil še en programček na drugi kišti, da odgovori - a lahko šeraš?

Firewall sem preverjal z $netstat -s -u pred in po zagonu tega programa, pa mi glede na izpis ni izločil nobenega novega UDP paketa. A je še kakšna druga opcija, da preverim, kje je obtičal ta konkreten paket?

----- pred zagonom programa -----
$ netstat -s -u
IcmpMsg:
InType0: 9
InType3: 13384
OutType3: 14232
OutType8: 18
Udp:
2923372 packets received
1272 packets to unknown port received
24 packet receive errors
1427682 packets sent
24 receive buffer errors
0 send buffer errors
IgnoredMulti: 3318
UdpLite:
IpExt:
InMcastPkts: 1950
OutMcastPkts: 1782
InBcastPkts: 3318
OutBcastPkts: 3
InOctets: 19626889448
OutOctets: 531556241
InMcastOctets: 239565
OutMcastOctets: 212840
InBcastOctets: 676702
OutBcastOctets: 234
InNoECTPkts: 14067093
InECT1Pkts: 760
InECT0Pkts: 100
MPTcpExt:

----- po zagonom programa -----
$ netstat -s -u
IcmpMsg:
InType0: 9
InType3: 13384
OutType3: 14232
OutType8: 18
Udp:
2923378 packets received
1272 packets to unknown port received
24 packet receive errors
1427701 packets sent
24 receive buffer errors
0 send buffer errors
IgnoredMulti: 3318
UdpLite:
IpExt:
InMcastPkts: 1950
OutMcastPkts: 1782
InBcastPkts: 3318
OutBcastPkts: 3
InOctets: 19626889874
OutOctets: 531557615
InMcastOctets: 239565
OutMcastOctets: 212840
InBcastOctets: 676702
OutBcastOctets: 234
InNoECTPkts: 14067099
InECT1Pkts: 760
InECT0Pkts: 100
MPTcpExt:

Zgodovina sprememb…

  • spremenil: slovencl ()

slovencl ::

še eno stvar sem opazil: paket, ki ga dobim nazaj ima TTL (Time To Live) nastavljen na 1. Ampak v tem primeru gre za izmenjavo podatkov preko enega switcha, tako da to najbrž ni problem ali pač?

Sem si naložil pa tudi dropwatch programček. In mi ne pokaže, da bi sistem karkoli vrgel stran.

Nimam več idej :(

misek ::

Za drugo stran sem uporabil program netcat: https://www.geeksforgeeks.org/introduct...
Za pregled fw pa uporabi komando
sudo iptables -L -n
ki ti prikaže pravila. In boš hitro videl ali imaš kaj nastavljeno ali ne.

Ahim ::

misek je izjavil:

Za drugo stran sem uporabil program netcat

Kako "drugo stran", ce je OPjev program "obe strani v enem"?

misek ::

Ahim je izjavil:

Kako "drugo stran", ce je OPjev program "obe strani v enem"?
Njegov program je dejansko samo klient in želi iz programa nekaj poslati na strežnik ter nazaj sprejeti odgovor.

slovencl ::

Sem poskusil enako kot si ti (poslat UDP paket na ta port z drugega računalnika) in zadeva tudi meni deluje.

BTW, na firewallu nimam nobenih pravil (sudo iptables -L -n ne pokaže nič). Ta moj program pošlje paket ven in če prav razumem, se na istem portu omogoči tudi povezava nazaj. Sem pa tudi dodatno odprl UDP port 7789, ki ga uporablja ta program, ampak ni razlike.

Očitno je problem v tem paketu. Sumim da zato, ker ima paket TTL nastavljen na 1 in ga zavrže - čeprav kot berem ga ne bi smel. Ni mi jasno, zakaj nikjer ne vidim zavrženega paketa. Lahko še z metodo uzaludnih pokušaja poskusim še na računalniku generirat UDP paket s TTL=1 da vidim če je to res.

Wireshark ta problematičen paket vidi. A wireshark skenira pakete še predenj pridejo do firewalla oz. jih sistem zavrže?

Zgodovina sprememb…

  • spremenil: slovencl ()

RobertDev ::

probaj close(tx_socket); premaknit višje preden ustvarjaš rx socket na istem portu!

sicer pa ustvariš en socket
bind potem sendto pošlješ podatke in recvfrom pa bo delal

https://stackoverflow.com/questions/356...

Zgodovina sprememb…

misek ::

RobertDev je izjavil:

sicer pa ustvariš en socket
Koda v prvem postu ima samo en socket.

slovencl ::

Tako je, sedaj poganjam prvo verzijo kode, s samo enim socketom.

GupeM ::

slovencl je izjavil:

Wireshark ta problematičen paket vidi. A wireshark skenira pakete še predenj pridejo do firewalla oz. jih sistem zavrže?

Da. Wireshark bere vse, kar pride do mrežne kartice (zato ga tudi moraš poganjati s pravimi privilegiji). Firewall ali kakšni drugi filtri paket zavržejo kasneje.

misek ::

Poskusi namesto svojega programa najprej uporabiti netcat, kjer moraš nazaj dobiti enak odgovor, kot bi ga sicer v svojem programu.
echo send_me_reply | nc -vvu 192.168.3.10 7789

RobertDev ::

kaj pa address.sin_addr.s_addr = INADDR_ANY;

slovencl ::

@RobertDev: sem poskusil, ni razlike

@Misek: Tudi izhodni port mora biti 7789. Sem poskusil z echo send_me_reply | nc -vu 192.168.3.10 7789 -p 7789.
Pošlje sicer samo en bayt (0x58), sicer nima veze, ker ravno tako sproži odgovor, ki pa ga zopet ne pokaže (nc ne izpiše ničesar).

Spodaj sken od wiresharka.

wireshark tx
wireshark rx

Zgodovina sprememb…

  • spremenil: slovencl ()

misek ::

V wiresharku vključi preverjanje checksum za IP in UDP pakete, da vidiš ali so ok.

slovencl ::

Problematičen paket ima vse OK.

wireshark tx + checksum ni ok, ampak to ni bistveno
wireshark rx + checksum vse OK.

misek ::

Zakaj se ti MAC naslovi ne ujemajo? Odgovor ti nazaj namreč prileti na drugi MAC, kjer je verjetno drugi IP naslov in tvoj program paketa dejansko ne sprejme.

slovencl ::

Jaoooo :O ...vse jasn, ko sem delal firmware za tale data logger sem poenostavil in sem dal kar fiksen mac v kodo (od tistega računalnika, s katerim sem delal). Zdaj pa sem uporabil drug računalnik, pa ni nič več delalo, na to poenostavitev pa sem čisto pozabil...

Zdej sem spoofal mac na tej kišti in vse dela :)

Hvala za pomoč, ne vem kdaj bi sam tole opazil :)

misek ::

Problem solved then :)

Ko nič ne dela moraš preveriti vsako malenkost, tudi takšno, ki sploh nima veze s problemom.

RobertDev ::

Super thinking out of the box bravo

FireSnake ::

Hardkodane spremenljivke so vedno recept za težave.
Lepo, da se je razrešilo.
Poglej in se nasmej: vicmaher.si


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Vzpostavitev strežnika (ubuntu)

Oddelek: Omrežja in internet
437154 (6355) s6c-gEL
»

iptables restart

Oddelek: Omrežja in internet
71850 (1673) BRBR
»

obtožba DoS napada!? (strani: 1 2 )

Oddelek: Informacijska varnost
669042 (5833) treker
»

bandwidth controll

Oddelek: Omrežja in internet
91579 (1344) urarrr
»

Samba porti

Oddelek: Omrežja in internet
341748 (1444) hruske

Več podobnih tem