Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire casa fara gaz/lemne

Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...
 probleme cu ochelarii

Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National
 Sub mobila de bucatarie si sub fr...

Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...
 Lucruri inaintea vremurilor lor

Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...
 

Dezvoltarea aplicațiilor ce comunică pe net

- - - - -
  • Please log in to reply
104 replies to this topic

#19
pale_and_pale

pale_and_pale

    Junior Member

  • Grup: Members
  • Posts: 187
  • Înscris: 11.07.2012

View Postdani.user, on 12 iunie 2013 - 18:00, said:

Practic ai avea 2 while'uri (unul pentru clienti noi si unui pentru citit de la fiecare client) ce nu prea merg, asa ca incepi sa-ti pui problema cum poti gestiona mai multi clienti simultan.
Prima idee care mi-a venit in minte e sa fac un alt executabil, sa zicem "ClientHandler" si cand primesc o conexiune in while-ul serverului sa il lansez in executie si sa se ocupe de client. Am renuntat pentru ca nu stiu cum sa "leg" clientul de noul executabil.
Apoi am cautat pe net si se pare ca "multithreading" e solutia potrivita....numai ca pare dificil....

#20
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Pe topicul despre Visual C++ 2010 am pus si un exemplu de multithreading.
E cea mai "slaba"/ineficienta solutie pentru a gestiona mai multi clienti, insa, pentru cativa, didactic, merge.

#21
xalexx

xalexx

    Junior Member

  • Grup: Members
  • Posts: 123
  • Înscris: 18.07.2008

Quote

Apoi am cautat pe net si se pare ca "multithreading" e solutia potrivita....numai ca pare dificil....
Se numeste mai pe romaneste server concurent. Serveste N clienti simultan.
In bucla de accept spamezi un child process(sa-i zicem thread in Windows) care sa serveasca fiecare client care vine cu requestul.
E treaba kernel-ului mai departe. Cand termina, thread-ul iese. Pentru orice client, e un child process din fork(Linux) sau thread (Windows)

Random article:
http://www.codeproje...-a-Simple-C-Imp

Sorry, dar sunt slab la Windows socket programming.

Edited by xalexx, 12 June 2013 - 19:29.


#22
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Pentru cei interesati, este aici un articol despre sockets pe linux.

In alta ordine de idei, sa zicem ca sunt pe un LAN (deci, in spatele unui router). Conexiunea exterioara se face cu ip-ul meu extern (care este acelasi pentru toate cele n computere ce alcatuiesc lan-ul). De unde stie routerul cui sa-i dea un anumit pachet? Am reusit sa fac o aplicatie server/client ce trimite date intre servar si client (urmand articolul din link-ul de mai sus), dar nu stie sa se conecteze decat daca am port forward pe portul pe care ma conectez.

Edited by Gady_paul, 12 July 2013 - 19:35.


#23
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Tocmai ti-ai raspuns la intrebare. Routerul stie carui calculator sa-i trimita pachetele (de conectare, SYN) in urma informatiilor precizate de tine la port forward. Daca ar fi o ferma serioase de servere si ar avea fiecare propriul IP public, n-ar mai fi nevoie de port forward.

#24
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Bun, stiu ca daca ii fac port foward se duce acolo, dar in majoritatea aplicatiilor nu am nevoie de asa ceva. De exemplu, ca sa accesez o pagina web nu am nevoie de port forward pe portul 80 si totusi, pachetele se duc unde trebuie.

#25
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Port forward e cand esti tu server, nu client. Cand esti client se descurca routerul, are o tabela interna cu IP-urile & porturile implicate la NAT, iar, cand primeste un pachet, o consulta si afla cui sa-l dea mai departe.

#26
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Si server fara port forward se poate?

#27
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Da, daca are propriul IP public.

#28
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Bun, si atunci cum functioneaza aplicatiile peer to peer?

#29
edy_3dz

edy_3dz

    Rau sau bun

  • Grup: Senior Members
  • Posts: 3,241
  • Înscris: 30.08.2008
Fie unul dintre participanti are IP public, fie cu ajutorul UPnP.

#30
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Mi-am facut si eu tema...oarecum :D. Am realizat o aplicatie ce transfera fisiere de colo colo. Inca mai am putin de lucru la ea (chestii gen erori, mesaje, eventual sa fie o aplicatie comuna ce poate rula si ca server si ca client, etc) dar functionalitatea de baza e la locul ei. E linux-only. Deci, pareri?

P.S. M-am tot gandit daca sa o pun aici sau la programe facute noaptea acasa, dar am zis ca e in ton cu subiectul si poate ajuta pe cineva.

#31
xyv123

xyv123

    Member

  • Grup: Members
  • Posts: 439
  • Înscris: 01.03.2012
Pe linux ai putea totusi sa folosesti sendfile pentru a transmite fisierul, e mai rapid.
http://linux.die.net/man/2/sendfile

#32
Paullik

Paullik

    Active Member

  • Grup: Members
  • Posts: 1,760
  • Înscris: 05.07.2008

View PostGady_paul, on 16 iulie 2013 - 10:15, said:

Mi-am facut si eu tema...oarecum Posted Image. Am realizat o aplicatie ce transfera fisiere de colo colo. Inca mai am putin de lucru la ea (chestii gen erori, mesaje, eventual sa fie o aplicatie comuna ce poate rula si ca server si ca client, etc) dar functionalitatea de baza e la locul ei. E linux-only. Deci, pareri?

P.S. M-am tot gandit daca sa o pun aici sau la programe facute noaptea acasa, dar am zis ca e in ton cu subiectul si poate ajuta pe cineva.
  • Citeste despre make si Makefiles, asta ca alternativa la ce ai facut tu acolo {client,server}Compile, la care oricum fiind ceva non-standard iti recomand sa le bagi niste extensii (ca e mai usor de depistat ce se afla acolo fara sa ma uit in commits ca sa vad ce descriere i-ai dat fisierului si fara sa ma uit la continut, ca poate nu ma intereseaza), in cazul asta recomand extensia .sh, dar citeste despre make ca e calea cea buna.
  • Nu vad rolul lui error.c, nu realizezi absolut nimic daca pui mesajele de eroare in alta parte si le invelesti intr-o functie, cand iti citesc codul numai ma faci sa ma invart prin fisiere ca sa descopar defapt doar un amarat de printf() (desi numele functiilor sunt destul de ilustrative).
  • for(; i>=0; buff[size - i] = temp[i], i--);
    
    Mie sincer nu-mi place ce ai facut aici, nu puteai sa pui ca oamenii botezati atribuirea aia intre acolade?
  • Aici e aiurea pus mesajul de eroare, clar acolo nu scrii in socket, ci citesti fisierul:
    int read = fread(buffer, 1, BUFFER_SIZE, f);
    if(read < 0)
    errorWritingOnSocket(); 
    
  • bzero si bcopy sunt non-standard, recomand memset, memcpy, memmove.
  • Legat tot ce chestii non-standard, tu iti implementezi propria itoa, cred ca poti folosi sprintf() in loc de ce ai tu acolo, avantajul e ca sprintf() e standard. Plus ca modul cum ai denumit parametrii la functie e... total aiurea, numele functiei e itoa (int to ascii) si tu iti denumesti parametrul de tip int "a", chestia asta face codul greu de urmarit. Din punctul meu de vedere ar fi trebuit sa arate asa:
    void itoa(int i, char *a)
    
    Dar foloseste sprintf().
  • Vad ca implementezi propriul progress bar, e ok, dar vezi "man pv" in caz ca nu stiai de programelul asta.
  • Eu personal recomand folosirea acoladelor chiar daca blocul de cod are doar o linie, in felul asta scapi de bug-uri mai tarziu.
Spor la treaba in continuare!

PS: Nu ti-am rulat codul, doar m-am uitat pe el.

Edited by Paullik, 16 July 2013 - 12:37.


#33
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Incearca sa extinzi programul cu urmatoarele noi cerinte:
  • Server-ul (daemon-ul) sa accepte orice numar de clienti in paralel
  • Server-ul sa afiseze in timp real progresul transferurilor
    [=====_______________] 25% a.txt
    [==========__________] 50% b.txt
    
    
  • Numele fisierului sa fie trimis prin socket inaintea continutului efectiv
  • Fa-l sa mearga si pe Windows cu schimbari minime in cod :D


#34
adrian93

adrian93

    Active Member

  • Grup: Members
  • Posts: 1,740
  • Înscris: 29.10.2009

View Postdani.user, on 16 iulie 2013 - 18:18, said:

Fa-l sa mearga si pe Windows cu schimbari minime in cod Posted Image

#ifdef LINUX
[...]
#ifdef WIN32
[...]


Schimbări minime de cod... dacă îl avem deja și pe cel pentru Windows Posted Image. (jk)

Edited by adrian93, 16 July 2013 - 22:41.


#35
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Sa o luam cetinel. In primul rand merci pentru feedback.

View Postxyv123, on 16 iulie 2013 - 11:16, said:

Pe linux ai putea totusi sa folosesti sendfile pentru a transmite fisierul, e mai rapid.
http://linux.die.net/man/2/sendfile

Am incercat  sa folosesc sendfile, numai ca il cam trimite pe tot odata. Eu il trimit pe bucati de 1024 bytes (ca veni vorba...este vreo dimensiune mai...optima sau ar functiona la fel cu orice dimensiune), si ma folosesc de numarul de bytes trimisi/primiti pentru a calcula cat mai are.
Cam tot din ce a spus paullik am implementat (au mai ramas cateva care vor urma).

Pana ma ocup de threading, am zis sa ma ocup de numele fisierului. Plecam de la premisa ca utilizatorul poate sa ii spuna clientului cai relative, deci nu pot trimite toata jucaria. M-am gandit sa scot numele fisierului luand partea de la ultimul / incolo (daca n-are, asta e). Cunoscand numele fisierului, trebuie sa il transmit cumva serverului.  Variante:

1. Trimit 100 caractere despre care si clientul si serverul stiu ca tin numele.
2. Fac un soi de conventie prin care trimit niste caractere, apoi aplic un atoi si aflu lungimea numelui pe care il iau dupa
3. Mai am cateva idei dar deja ma complic prea mult. So...cum ar fi mai bine sa fac?

Edited by Gady_paul, 18 July 2013 - 21:51.


#36
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Trimiti intai lungimea numelui apoi numele apoi continutul. Sau pui un \0 dupa nume, inainte de continut.

Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate