Jump to content
Adizere

Server UDP in C

Recommended Posts

Posted

am un client-server care comunica prin UDP, protocolul..

0. la start si clientul si serverul pornesc cu un argument ce e de fapt marimea datagramelor care le vor trimite (server) sau le vor primi (clientu), ca sa ruleze corect ar trebui ca argumetul clientului >= argumentul serverului

1. clientul trimite numele unui fisier

2. serverul trimite un int (sa zicem ca se numeste nr) care reprezinta numarul de bucati care urmeaza sa i le trimita clientului (nr este marimea fisierului mod marimea datagramei)

3. serverul trimite nr datagrame, continutul fisierului a carui nume l-a trimis clientul la 1.

4. clientul asteapta nr datagrame de la server si continului fiecareia il salveaza intr-un fisier (acelasi nume cu numele trimis serverului, la 1.)

5. dupa ce primeste alea nr datagrame, clientu se opreste, salveaza fisierul

problema e urmatoarea: clientul se blocheaza la (de exemplu, am patit si la 500, sau la 30, important este si marimea datagramelor) 1000+ datagrame, deci primeste vreo 40-50% din numarul total de bucati trimise de server si apoi nu mai primeste nimic(ramane in asteptare dupa restul bucatilor), daca dau un netstat -s imi apar RcvbufErrors: X, unde X este (numarul total de bucati trimise de server) - (numarul de bucati primite de catre client)

DAR

in server, in ciclul unde se face sendto() catre client, daca pun un uslepp(10) sau un printf() de un mesaj care sa tine serverul putin ocupat intre send-uri, clientul primeste cu succes toate datagramele

am rulat programele pe ubuntu din VirtualBox pe serverul linux de la scoala.. insa problema si rezolvarea era aceeasi si acolo

ex: pentru un fisier de marime 1.943.445, cu datagram size de 60.000 (client si server) se vor trimite 33 de bucati.. la o rulare a primit doar 4, la a doua a primit 17, la a 3-a pornire a clientului a primit 3 datagrame, restul au aparut la RcvbufErrors, serverul a ramas tot deschis intre timp; daca incerc pe acelasi fisier cu marimea bucatilor de 1.000, serverul va trimite 1944 datagrame.. clientul se blocheaza la 1200 / 1159 / 1102/ 1200

am uploadat codul serverului si al clientului la

Download udp (1).zip - FisierulMeu.ro

se pricepe cineva? :)

Posted (edited)

Pai protocolul udp nu face verificare daca informatia a fost transmisa cu succes. Daca merge adaugand un sleep intre call-urile la functia send inseamna ca nu poti primi informatia asa de repede in client.

Foloseste mai bine tcp - astfel vei fi sigur ca informatia a ajuns, si nu te mai chinui cu nr de pachete, etc.

Edited by Ethereal
Posted

welcome to the world of udp :)

nu face niciodata file transfer pe udp fara un protocol bine definit de tine(sau altcineva) care verifica integritatea datelor si tranzmiterea corecta si completa a lor (mai pe scurt foloseste tcp ca face el asta pt tine)

daca vrei sa faci o treaba (in udp) am impresia ca trebuie sa ti cont neaparat de mtu (adica sa incerci sa trimiti pachete pana in 1500 bytes la majoritatea retelelor Maximum transmission unit - Wikipedia, the free encyclopedia ) si sa iti faci un mod de indexare + verificare a pachetelor

  • Downvote 1
Posted

Ideea era sa imi dau seama cum functioneaza UDP-ul, de-aia am folosit protocolul acesta.

@Xander: ideea este ca si cu marimea pachetelor mica tot pierd in majoritatea cazurilor mai mult de 50% din pachete

Mi se pare ciudat ca rezolvarea este practic incetinirea vitezei la care trimite serverul pachetele, pentru ca amandoi trimit si primesc in (teoretic) acelasi ritm

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...