Avatar billede ulj Nybegynder
05. november 2008 - 13:02 Der er 13 kommentarer

Linux socket problem. Ikke alle UDP pakker sendes med 3G-modem?

Hej

Jeg har et problem med sockets i Linux og funktionen sendto (UDP).

I en for-løkke kaldes sendto et vis antal gange, eksempelvis 20. Herved sendes 20 "pakker" af hver ca. 110 bytes afsted til modtageren. Dette virker fint ved LAN og WLAN, hvor alle pakkerne bliver sendt af sted (det kan jeg se i Wireshark). Men hvis jeg tilslutter mit 7.2 mbit 3G-modem, hvor signalstyrken er rigtig god, så kan jeg se i Wireshark at ikke alle pakker bliver sendt afsted. Det er sådan set ret systematisk, at det kun er de første 6 "pakker" der sendes.

Efterfølgende har jeg prøvet med et delay (usleep i 50 msec.), hvorved alle 20 pakker bliver sendt af sted. Det er dog ikke en brugbar løsning, da dette delay afhænger af pakkestørrelsen, som varierer og kan være større end 110 bytes (maksimalt 1400 i mit tilfælde).

Jeg har prøvet at ændre på SO_SNDBUF via setsockopt samt at anvende poll() med POLLOUT, hvilket ikke har hjulpet.

Er der nogle som har nogle idéer eller gode råd?

Ulrik
Ovenstående må betyde, at
Avatar billede ulj Nybegynder
05. november 2008 - 13:04 #1
Se bort fra sidste (og halvfærdige) sætning. Tak.
Avatar billede lars314 Nybegynder
05. november 2008 - 13:34 #2
Er der ikke noget med at du ikke er garanteret at en UDP pakke kommer frem til modtageren ?
Avatar billede segmose Nybegynder
05. november 2008 - 13:40 #3
Jo, kun med TCP/IP er du garenteret at få sendt pakkerne eller få en fejl.
Avatar billede ulj Nybegynder
05. november 2008 - 13:42 #4
Til begge to. Prøv nu at læs hvad jeg skriver før I svarer!

Jeg kigger slet ikke på modtagersiden. Jeg kan se, at mit 3G-modem ikke sender pakkerne! Det har intet at gøre med, om det er UDP eller TCP.
Avatar billede lars314 Nybegynder
05. november 2008 - 13:51 #5
Øh undskyld men jeg læste hvad du skrev.
Er du sikker på du er garanteret at dine pakker bliver sendt hvis du sender mere end f.eks. bånbredden på din forbindelse.
Avatar billede ulj Nybegynder
05. november 2008 - 14:22 #6
Okay. Så undskylder jeg. Men at pakkerne ikke er garanteret at komme frem til modtageren er ikke det væsentlige, da jeg ikke kigge på modtagersiden, men kun på afsendersiden.

Jeg er selvf. godt klar over, at der ikke er garanti for modtagelse af UDP pakker. Men om der er garanti for afsendelse, er jeg ikke klar over.

Jeg har analyseret outputtet netstat -s og netstat -su (efter at have læst http://www.29west.com/docs/THPM/udp-buffer-sizing.html). Jeg kan se at der ikke har været nogle UDP RcvbufErrors og SndbufErrors fejl. Men Wireshark viser stadig det rigige, at ikke alle pakker bliver afsendt.

Hvordan skulle Wireshark vide, om pakkerne bliver tabt af modemmet pga. lav båndbredde?
Avatar billede segmose Nybegynder
05. november 2008 - 15:01 #7
Prøv at læse i linket punkt 8.2, der ser ud til at forklare dit problem:
"8.2. UDP Buffer Space Too Small: Consequences

Too little UDP buffer space causes the operating system kernel to discard UDP packets."

Så det ser ud til at du har for lille buffer som gør at scheduling bliver et problem.

"The kernel often keeps counts of UDP packets received and lost."

"often" er måske kode ordet her, da dit system måske ikke gør?

Din pause får at der skiftes process, prøv at lave et frivilligt process skift efter hver pakke hvis du kan.

Så prøv lige at se hvor stor din buffer reelt er og ændre den til en fornuftig værdi.
Avatar billede segmose Nybegynder
05. november 2008 - 15:07 #8
Til din formel i linket skal du have fundet ud af hvilken båndbredde du vil acceptere som minimum og udregne bufferen efter det, hvis du ikke vil acceptere nogen minimum må du sætte det efter hvad du regner med at ville sende.
Avatar billede ulj Nybegynder
05. november 2008 - 15:28 #9
Jeg kører OpenSuse 11.0.

UDP Send buffer og UDP Recv buffer er på 109568 som default kan jeg se ved getsockopt. Ved setsockopt kan jeg maksimalt sætte dem begge til 262142. Dette har desværre ingen effekt. Det er stadig kun de første 6 pakker som sendes - resten discardes.
Avatar billede ulj Nybegynder
05. november 2008 - 15:29 #10
Ved at lave et "frivilligt process skift", som du selv kalder det, tager det stadigvæk længere tid at sende pakkerne og et delay vha. usleep vil fungere lige godt.
Avatar billede ulj Nybegynder
07. november 2008 - 09:09 #11
Efter nærmere tests og omtanke, har jeg fundet "problemet" som er upload båndbredden. Ved et 3G-modem er båndbredden selvf. ikke konstant, som signalet på en mobiltelefonen.
Derfor oplever jeg, at jeg sender for meget data på et sekundt i forhold til båndbredden, der er til rådighed. Dette giver god mening i forhold til indsættelse af et delay i sendfunktionen.
Tak for hjælpen til dem som har kommenteret.
Avatar billede segmose Nybegynder
09. november 2008 - 00:48 #12
Burde UPD'er så ikke bare blive i bufferen indtil der er båndbredde?
Avatar billede ulj Nybegynder
09. november 2008 - 18:09 #13
Det skulle man tro. Det er i hvert fald tilfældet med TCP. Men altså ikke med UDP! Det er i hvert fald, hvad jeg oplever.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester