Dezvoltarea aplicațiilor ce comunică pe net
Last Updated: Nov 12 2013 23:29, Started by
dani.user
, Mar 14 2013 23:03
·
0
#19
Posted 12 June 2013 - 18:50
dani.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. Apoi am cautat pe net si se pare ca "multithreading" e solutia potrivita....numai ca pare dificil.... |
#20
Posted 12 June 2013 - 18:55
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
Posted 12 June 2013 - 19:26
Quote Apoi am cautat pe net si se pare ca "multithreading" e solutia potrivita....numai ca pare dificil.... 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
Posted 12 July 2013 - 19:33
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
Posted 12 July 2013 - 19:37
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
Posted 12 July 2013 - 20:04
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
Posted 12 July 2013 - 21:53
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.
|
#28
Posted 16 July 2013 - 01:41
Bun, si atunci cum functioneaza aplicatiile peer to peer?
|
|
#29
Posted 16 July 2013 - 09:46
Fie unul dintre participanti are IP public, fie cu ajutorul UPnP.
|
#30
Posted 16 July 2013 - 10:15
Mi-am facut si eu tema...oarecum . 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
Posted 16 July 2013 - 11:16
Pe linux ai putea totusi sa folosesti sendfile pentru a transmite fisierul, e mai rapid.
http://linux.die.net/man/2/sendfile |
#32
Posted 16 July 2013 - 12:25
Gady_paul, on 16 iulie 2013 - 10:15, said:
Mi-am facut si eu tema...oarecum . 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.
PS: Nu ti-am rulat codul, doar m-am uitat pe el. Edited by Paullik, 16 July 2013 - 12:37. |
#33
Posted 16 July 2013 - 18:18
Incearca sa extinzi programul cu urmatoarele noi cerinte:
|
|
#34
Posted 16 July 2013 - 22:40
#35
Posted 18 July 2013 - 21:51
Sa o luam cetinel. In primul rand merci pentru feedback.
xyv123, 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
Posted 18 July 2013 - 21:57
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