Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
Dezvoltarea aplicațiilor ce comunică pe net
#37
Posted 18 July 2013 - 22:37
Si lungimea cum o trimit? pe 2-3 caractere, apoi ii zic un atoi?
|
#38
Posted 19 July 2013 - 00:34
Direct ca si int, pe 8/16/32 de biti, cum alegi tu sau cat ai nevoie, big endian.
|
#39
Posted 20 July 2013 - 01:30
Bun, acum accepta mai multi clienti in paralel, si trimite numele fisierului. Mai am de rezolvat chestia aia cu zombie problem (trebuie sa mai sap putin, nu am experienta la multithreading deloc).
Acum intrebarea este: cum pot face serverul sa afiseze progresul la toti clientii? Chiar daca mi-a recomandat paullik un programel interesant, tinand cont ca inca invat, mai trebuie sa ma chinui putin cu reinventatul rotii . In progress bar-ul meu, ma folosesc de /r, si periodic (de fiecare data cand este apelata functia mai exact), scriu un /r, ma duc la inceputul liniei si suprascriu caracterele. Acum serverul trebuie sa poata face asta pe mai multe randuri. No idea how... Si ca era vorba de mutat pe windows...cat de minime pot fi schimbarile alea "minime", ca 80% din cod e cam...diferit . P.S. Link-ul e asta: https://github.com/P...tree/threading. Sa nu alergati prea mult dupa el . P.P.S. Momentan serverul sta deschis pana il inchid eu cu toporul (a se citi ctrl+c sau alte mijloace neortodoxe). Cum pot face ca el sa functioneze pana ii scriu exit de exemplu? stiu, as putea sa il intreb pe utilizator, numai ca pana raspunde utilizatorul serverul nu va primi conexiuni de la clienti. Edited by Gady_paul, 20 July 2013 - 01:36. |
#40
Posted 20 July 2013 - 04:45
Gady_paul, on 20 iulie 2013 - 01:30, said:
cum pot face serverul sa afiseze progresul la toti clientii? Edited by neagu_laurentiu, 20 July 2013 - 04:53. |
#41
Posted 20 July 2013 - 10:49
Gady_paul, on 20 iulie 2013 - 01:30, said:
P.P.S. Momentan serverul sta deschis pana il inchid eu cu toporul (a se citi ctrl+c sau alte mijloace neortodoxe). Cum pot face ca el sa functioneze pana ii scriu exit de exemplu? stiu, as putea sa il intreb pe utilizator, numai ca pana raspunde utilizatorul serverul nu va primi conexiuni de la clienti. https://en.wikipedia...signal_handling De asemenea vezi: http://www.cplusplus...cstdlib/atexit/ Nu stiu excat daca terminarea procesului cu CTRL+C se incadreaza chiar la "program terminates normally", dar e bine de stiut ca exista functia asta. Oricum, daca implementezi un signal handler pt. SIGINT nu o sa mai ai nevoie (in cazul asta) de functia atexit. PS: Semi-solutii ar mai fi: Rulezi server-ul propriu zis pe un thread (sau mai multe), iar pe thread-ul principal citesti de la tastatura, cand utilizatorul introduce "exit" sau CTRL+D (end of file) inchizi celelalte thread-uri, dar asta mi se pare asa... work-around, recomand solutia cu signal handlers. Edited by Paullik, 20 July 2013 - 10:53. |
#42
Posted 20 July 2013 - 18:05
Legat de afisarea simultana pe server al progresului fisierelor, nu e greu sa folosesc o biblioteca facuta pentru asta, dar, for learning purposes, as prefera sa o fac manual. M-am gandit ca serverul sa numere clientii, si fiecare thread din server care se ocupa cu transferul sa stie ca e al 5-lea de exemplu. Si functia care afiseaza loaderul, in loc sa afiseze un \r pentru a se duce la inceput, foloseste un escape sequence pentru a pune cursorul la inceputul liniei 5. Numai ca, la lansarea in executie a serverului ar trebui sa stiu pe ce linie se afla cursorul, pentru a putea calcula pe ce linie sta loaderul fiecarui fisier. Ma gandeam sa folosesc escape sequeces pentru a afla pe ce linie se afla cursorul, numai ca nu prea am reusit. stie cineva cum pot face asta?
Cat despre solutia cu signals, e o idee, dar asta ar insemna sa folosesc ctrl+c ca sa inchid executia. Eu ma gandeam ca utilizatorul sa poata folosi si alte mijloace de inchidere...mai...ortodoxe (nu prea am vazut programe care sa aiba ca singur mod de inchidere ctrl+c). semi-solutia de acolo ar fi plauzibila (combinata si cu signals eventual). Alte idei? |
#43
Posted 20 July 2013 - 18:40
Daemon-urile sub Linux nici n-au interfata deregula, asa ca oricum nu sta utilizatorul sa scrie EXIT in ele
|
#44
Posted 21 July 2013 - 21:12
Avand in vedere ca unii au cam reusit sa creeze un server, propun urmatoarea tema pentru a face trecerea spre dezvoltarea site-urilor.
Tema Sa se realizeze un server HTTP 1.0.
Aplicatia va fi usor de testat folosind orice browser. Pentru partea statica, creati ceva site mic format din cateva fisiere html si cateva poze. STATIC - browserul cere o resursa (ex, /index.html), serverul considera ca e vorba de pe un fisier de pe disc, iar daca acesta exista, e citit iar continutul sau trimis mai departe catre client DINAMIC - browserul cere o resursa adesea oferind si informatii suplimentare (ex. /patrat?a=2), serverul considera ca e vorba de o aplicatie, executa aplicatia in cauza (daca exista) trimitandu-i ca date de intrare, informatiile precizate, iar apoi trimite spre client raspunsul aplicatiei. In cazul cerintelor din aceasta tema, aplicatiile pentru /patrat, /login, /verificare nu vor fi executabile separate, ci codul lor va fi implementat direct in server (ex. functia patrat(...) va fi apelata daca clientul cere /patrat). Beneficiile temei
Daca reuseste cineva asta, va arat cum puteti introduce PHP in poveste. |
#45
Posted 23 July 2013 - 19:55
Hehe, aveam de ceva timp pe todo list "create a simple HTTP server", numa' bine!
Am trisat putin, am folosit Qt si C++, nu C, din diverse motive. https://github.com/paullik/http-daemon Codul e plin de TODOs, dar face tot ce a spus dani.user mai sus. Pareri si critici, va rog! In mare parte as vrea sa-mi spuneti daca e ok dpdv arhitectural si structural. Apoi nu stiu exact cum sa fac citirea in cazul unei cereri POST daca nu este trimisa dintr-o bucata pe retea, sa zicem ca se trimite asa: POST /foo HTTP/1.1\r\n Content-Length: 3\r\n \r\n Prima bucata, apoi: n=2 Asta e o cerere POST valida, doar ca e trimisa in doua bucati, in codul meu s-ar opri dupa field-urile din header (cele doua secvente CRLF) si nu ar mai citi body-ul. Am o idee in minte, dar mi se pare destul de complicata si ma intreb cum ati rezolva voi problema asta. As citi pana gasesc cele doua secvente CRLF si apoi as parsa request header-ul ca sa aflu din Content-Length cat mai trebuie citit si as continua cu citirea body-ului, dar poate cand am citit am sarit deja peste CRLF-urile alea si ar trebui sa ma uit inapoi ca sa vad cat de mult am citit peste ele si sa citesc doar cat a ramas. Aici mi se pare ca se complica inutil codul si ma gandesc ca poate voi aveti ceva idei mai bune/simple. Problema asta se vede cand fac cererile cu telnet De asemenea ma deranjeaza tare de tot metodele check(), login() si square() ca nu-si au locul in clasa HTTPThread, daca era dupa mine as fi facut o clasa ModuleLoader si as fi incarcat functionalitatea (data acum de acele metode) din .so-uri sau .dll-uri cu un mic dictionar de configurare gen: "requested_path" -> "module_to_load.so" Nu m-am aruncat la implementarea incarcarii unor astfel de module ca nu stiu exact cum se face integrarea diferitelor tehnologii (PHP si Python am in minte) si am zis ca poate o sa impusc doi iepuri dintr-o data. Stiu ca pt. PHP in apache pot folosi mod_php.so, in lighthttpd FastCGI, iar pt. Python stiu de WSGI, dar nu stiu exact ce-s astea si de unde sa incep ca sa o iau cu inceputul... @dani.user, tine-o tot asa. Edited by Paullik, 23 July 2013 - 19:56. |
#46
Posted 23 July 2013 - 21:33
Nu stii niciodata din cate bucati vei primi datele.
Faci un buffer mai mare (eventual dinamic sau cu verificari sa nu poata fi exploatat vreun buffer overflow) si bagi in el tot ce vine, verificand constant daca in buffer exista un \n\n (\r nu e obligatoriu). Daca ai intalnit (\r)\n(\r)\n, extragi frumos headerul din bufferul acela si-l parsezi. Daca, dupa ce-ai analizat headerul te intereseaza si ce-i dupa \n\n, iei din bufferul actual ce-o mai ramas dupa \n\n si dai mai departe spre procesare, urmand sa dai mai departe spre procesare si ce primesti in continuare pe socket, fara a mai baga in acel buffer. Pe Content-length iar nu te poti baza tot timpul, acesta putand lipsi, caz in care citesti pana la inchiderea conexiunii. Apoi, foloseste HTTP 1.0 pentru inceput, scapi de niste batai de cap. Integrarea cu PHP o voi prezenta pe weekend, mai las ceva timp si altora sa incerce sa vina cu o solutie. Observatii
|
|
#47
Posted 24 July 2013 - 12:38
dani.user, on 23 iulie 2013 - 21:33, said:
Pe Content-length iar nu te poti baza tot timpul, acesta putand lipsi, caz in care citesti pana la inchiderea conexiunii. Dupa inchiderea conexiunii nu ma pot orienta oricum, deoarece clientul tine conexiunea deschisa asteaptand de la server raspunsul. dani.user, on 23 iulie 2013 - 21:33, said:
Integrarea cu PHP o voi prezenta pe weekend, mai las ceva timp si altora sa incerce sa vina cu o solutie. Nu de alta, dar eu in weekend plec si o sa fie o pauza, si vreau sa am sapt. asta de lucru. dani.user, on 23 iulie 2013 - 21:33, said:
dani.user, on 23 iulie 2013 - 21:33, said:
dani.user, on 23 iulie 2013 - 21:33, said:
dani.user, on 23 iulie 2013 - 21:33, said:
In mod normal as genera un id format din nick si ceva random data , id pe care l-as stoca in db si in cookie, iar cand userul vine pe server cu cookie-ul respectiv eu verific ca id-ul sa fie cel aferent lui din db. |
#48
Posted 24 July 2013 - 18:19
Paullik, on 24 iulie 2013 - 12:38, said:
Standardul zice ca ar trebui sa retrnez 400 Bad request daca nu am Content-Length si exista un body, asa am si refacut, daca cererea e POST si nu am Content-Length, eroare, altfel ma orientez dupa Content-Length. Dupa inchiderea conexiunii nu ma pot orienta oricum, deoarece clientul tine conexiunea deschisa asteaptand de la server raspunsul. Corect, ma gandeam invers, la ce trimite serverul. Paullik, on 24 iulie 2013 - 12:38, said:
OK, niste pointeri ca sa citesc despre asta pana atunci, niste termeni tehnici care au legatura cu ce vei zice? http://stackoverflow...stom-web-server Paullik, on 24 iulie 2013 - 12:38, said:
Recomanda-mi ce-i de facut, te rog! De exemplu
Paullik, on 24 iulie 2013 - 12:38, said:
In mod normal as genera un id format din nick si ceva random data , id pe care l-as stoca in db si in cookie, iar cand userul vine pe server cu cookie-ul respectiv eu verific ca id-ul sa fie cel aferent lui din db. Aici poti tine chiar in memorie acele informatii. Scapi de multe situatii unde folosirea bazelor de date (primul lucru care-ti trece prin minte cand folosesti php) e overhead. |
#49
Posted 28 July 2013 - 08:37
Gady_paul, te incumenti sa rezolvi tema cu serverul web?
|
#50
Posted 28 July 2013 - 11:34
Vine si ea . M-am mai chinuit putin cu vechea tema sa o mai finisez (fara prea mari succese).
|
#51
Posted 19 August 2013 - 20:27
ok, gata. I-a venit randu
Da' au venit si problemele, asa ca o sa am nevoie de oleaca de ajutor. Eu m-am gandit sa fac asa: fac un buffer de 1000 de bucati (sper ca ajunge) si iau caracter cu caracter si bag in el. numai ca dupa sapaturi indelungi, am aflat ca la el liniile se termina in "\v\n" (parca \v e escape de la vertical tab), nu in "\n\n". o iau eu razna sau asa e? |
|
#52
Posted 19 August 2013 - 21:32
Gady_paul, on 19 august 2013 - 20:27, said:
ok, gata. I-a venit randu Da' au venit si problemele, asa ca o sa am nevoie de oleaca de ajutor. Eu m-am gandit sa fac asa: fac un buffer de 1000 de bucati (sper ca ajunge) si iau caracter cu caracter si bag in el. numai ca dupa sapaturi indelungi, am aflat ca la el liniile se termina in "\v\n" (parca \v e escape de la vertical tab), nu in "\n\n". o iau eu razna sau asa e? \r\n Dar nu te baza pe asta, fa initial asa, dar cineva poate trimite si doar "\n"-uri pt. separare, totusi ca tema, merge si doar cu "\r\n". Buffer-ul il redimensionezi daca nu-ti ajunge, dar nu faci redimensionarea cu cate un caracter sau ceva mic, ca risti sa fie incet daemonul, aloci blocuri de memorie ca sa eviti apelarea malloc/realloc de multe ori. Spor! |
#53
Posted 19 August 2013 - 21:54
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? #if 1 # define ERR_LOG(fmt, args...) fprintf(stderr, "%s (%d) in %s(): ", \ __FILE__, __LINE__, __FUNCTION__); \ fprintf(stderr, fmt, ## args) #else # define ERR_LOG(fmt, args...) #endif |
#54
Posted 19 August 2013 - 22:31
Gady_paul, on 19 august 2013 - 20:27, said:
Eu m-am gandit sa fac asa: fac un buffer de 1000 de bucati (sper ca ajunge) si iau caracter cu caracter si bag in el. numai ca dupa sapaturi indelungi, am aflat ca la el liniile se termina in "\v\n" (parca \v e escape de la vertical tab), nu in "\n\n". o iau eu razna sau asa e? Pur si simplu ignori acel \r si obtii acelasi numaru de linii si daca sunt separate de \r\n si daca sunt separate de \n |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users