Adizere Posted April 3, 2010 Report Posted April 3, 2010 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 serverului1. clientul trimite numele unui fisier2. 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 fisierulproblema 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)DARin 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 datagrameleam rulat programele pe ubuntu din VirtualBox pe serverul linux de la scoala.. insa problema si rezolvarea era aceeasi si acoloex: 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/ 1200am uploadat codul serverului si al clientului laDownload udp (1).zip - FisierulMeu.rose pricepe cineva? Quote
Ethereal Posted April 3, 2010 Report Posted April 3, 2010 (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 April 3, 2010 by Ethereal Quote
Xander Posted April 4, 2010 Report Posted April 4, 2010 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 1 Quote
Adizere Posted April 4, 2010 Author Report Posted April 4, 2010 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 pacheteMi se pare ciudat ca rezolvarea este practic incetinirea vitezei la care trimite serverul pachetele, pentru ca amandoi trimit si primesc in (teoretic) acelasi ritm Quote