Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Boxa membrana tweeter infundata

ajutor

Whisky for Mac

Xiaomi 14 Gpay
 Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...
 De ce sunt oamenii nostalgici

Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?
 polita RCA ONLINE

Termostat frigider - verificare

Mai au PC-urile vreun viitor?

Centrala termica immergas
 

Dezvoltarea aplicațiilor ce comunică pe net

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

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
În ziua de azi netul e pretutindeni, mulți sunt conectați chiar permanent oriunde s-ar afla prin oraș.

Întrebarea care se pune e: cum fac uz de internet dintr-o aplicație C?
Mulți ați fi tentați să oferiți un răspuns de genul:

Quote

Din C??? Păi trebuie să învâț PHP pentru asta...

Greșit.
PHP are rolul său în această lume virtuală, dar nu este centrul universului. Până la urmă ce legătură are diferența dintre 2 limbaje cu utilizarea internetului?

echo 'Ana are ' . $val . ' mere';
printf("Ana are %d mere", val);

Deasemenea comunicarea pe net nu se rezumă doar la HTTP (site-uri).

Întrucât abundă netul de scripturi PHP de slabă calitate, scrise de persoane care n-au înțeles pe deplin cu ce se mănâncă, voi încerca să detaliez aici cum stă treaba, să arăt că dezvoltarea aplicațiilor web tot programare este, cu aceleași principii, dar și cu particularități ce necesită o atenție sporită; și ce abordare didactică mai potrivită decât utilizarea limbajului C (sper cunoscut de toți cititorii) și a biblioteciilor puse la dispoziție de sistemul de operare :D.

  • Introducere în rețelistică

    În lumea digitală toată informația se reprezintă ca o succesiune de bytes (octeți). Comunicarea între calculator și un perific se poate asemăna cu scrierea în fișiere. La fiecare capăt există câte două fișiere deschise, într-unul se scrie iar din celălalt se citește, ce este scris la un capăt urmând a fi citit la celălalt.

    Dacă las acasă un bilet intitulat "Azi ajung târziu", fiind într-un mediu restrâns, am oferit suficientă informație pentru ca destinatarul acelui bilet să-l înțeleagă. Dacă pun însă într-o cutie postală același bilet, va fi degeaba, fiindcă nu conține suficientă informație pentru a ajunge la cine trebuie.

    În rețelistică, informația e transmisă deregulă sub formă de pachete (până în 1500 bytes/pachet). Ca în exemplul de mai sus, dacă s-ar transmite 1500 bytes doar de informație utilă (ex. conținutul unui site), pachetul ar fi inutil, el nespecificând nimic despre cui îi este adresat mesajul (iar la cât e netul de mare... ar fi ceva destinatari posibili).

    Pentru a rezolva această problemă, fiecare pachet, pe lângă informația utilă, conține și informație menită să descrie care-i treaba cu pachetul. O convenție des utilizată implică utilizarea unei adrese sursă respectiv destinație pe 4 octeți, adresă denumită IP(v4). Această adresă se reprezintă de regulă în formă zecimală A.B.C.D (ex. 127.0.0.1 - adresa locală a oricărui dispozitiv)

    În continuare voi considera, pentru simplificare, că fiecare dispozitiv implicat dispune de o astfel de adresă. Voi insista deasemenea doar pe aspecte ce privesc programatorul, cei interesați de aspectul rețelistic având ca punct de plecare http://en.wikipedia...._protocol_suite

    Fiecare pachet având o adresă sursă respectiv destinație, deja pachetul poate ajunge unde trebuie, dar încă nu este suficient. În ziua de azi pe un calculator rulează zeci de aplicații. Dacă fiecare accesează aceeași resursă de pe net, de unde știm care pachet cărui program îi este destinat?

    Înainte de a trece mai departe, vreau să menționez că, la fel ca în cazul utilizării telefonului mobil, în rețelistică există 2 mari tipuri de abordări ale comunicării, abordarea aleasă fiind menționată în fiecare pachet:

    • TCP - similară unei conversații telefonice: are un punct de pornire, se transmit informații ordonate în ambele sensuri, iar apoi se finalizează. Pentru a asigura că ce este transmis ajunge ok la destinație, se fac diverse verificări, iar pachetele ce nu ajung ok sunt retransmise.
    • UDP - similară unui SMS: o parte transmite oricând un mesaj celeilalte, fără a știi sigur dacă acel mesaj a și ajuns, sau dacă mai multe mesaje ajung în ordinea în care au fost transmise

    Pentru a se putea distinge între pachetele ce trebuiesc să ajungă la o aplicație, respectiv la alta, în cadrul aceluiași sistem, a mai fost introdusă o informație denumită port (intreg fără semn pe 16 biți). Astfel fiecare pachet ce utilizează protocolul (convenția) IP, din care TCP sau UDP, va conține și informații cu privire la portul sursă respectiv portul destinație.

    Un exemplu concret, TCP:

    Fie două sisteme, unul cu adresa IP 1.2.3.4, celălalt cu adresa 2.3.4.5.

    În cazul celui dintăi se pornește un daemon HTTP. Acest proces va cere sistemului de operare că vrea să accepte conexiuni (analogie: să poată fi sunat) TCP pe portul 80. Dacă nu e nici o altă aplicație care să accepte la momentul respectiv conexiuni pe portul TCP 80 pe acel sistem, sistemul de operare îi va aproba cererea și va știi că, dacă primește de pe rețea o cerere de conectare spre portul TCP 80, o va da mai departe spre aplicația în cauză.

    În cazul sistemului al doilea, un browser dorește să acceseze un site deservit de primul sistem. Browserul va cere sistemului de operare: fă-mi legătura cu 1.2.3.4 pe portul TCP 80. Pentru a putea știi cărei aplicații să îi dea mai departe răspunsul, sistemul de operare va aloca un port nefolosit drept port sursă (ex. 6789), iar apoi va transmite un pachet având IP sursă: 2.3.4.5, IP destinație: 1.2.3.4, protocol: TCP, port sursă: 6789, port destinație: 80. Dacă daemon-ul HTTP e pornit pe prima stație, acesta va transmite înapoi un pachet cum că e ok, conexiunea s-a realizat. În continuare se vor transmite pachete ce conțin header-ele menționate, alternativ (funcție de cine e sursa și cine e destinația), dar cu aceleași valori ale porturilor. La final, când o parte consideră că dorește să încheie conversația, se va transmite un pachet special ce indică acest lucru, cu rol de a anunța și cealaltă parte că s-a încheiat conversația.

    De reținut că pe aplicație n-o interesează ce fel de conexiune la internet e folosită. N-o interesează nici măcar dacă e vorba de internet sau doar de o rețea locală.

    Un alt aspect important este legat de DNS (Domain Name System). Ar fi destul de aiurea ca, atunci când intrăm pe un site să trebuiască să introducem ceva de genul http://12.34.56.78/. Pentru a face lucurile mai comode, s-a introdus DNS. La modul simplist: mai multe servere țin o evidență nume-adresă IP ce ne permite să accesăm http://www.google.com lăsând pe seama sistemului să afle care e defapt adresa(-ele) IP asociată www.google.com.

    Quote

    C:\>nslookup www.google.com
    Server:  *
    Address:  *

    Non-authoritative answer:
    Name:    www.google.com
    Addresses:  2a00:1450:400d:802::1012
              62.231.91.104
              62.231.91.108
              62.231.91.109
              62.231.91.113
              62.231.91.114
              62.231.91.118
              62.231.91.119
              62.231.91.123
              62.231.91.84
              62.231.91.88
              62.231.91.89
              62.231.91.93
              62.231.91.94
              62.231.91.98
              62.231.91.99
              62.231.91.103


  • API-ul pus la dispoziție de sistemul de operare cu privire la rețelistică

    API-ul pentru lucrul în rețea sub Windows se numește Winsock. Acesta este foarte asemănător cu cel din lumea *nix.

    Headerul ce va trebui inclus este Winsock2.h (este mai nou decât tradiționalul Winsock.h însă e inclus în toate versiunile moderne ale sistemului de operare) iar implementarea funcțiilor folosite se găsește în biblioteca ws2_32.dll. Pentru a ușura lucrul cu funcțiile din această bibliotecă, vom folosi biblioteca de import Ws2_32.lib (în cazul Visual C++):

    #pragma comment(lib, "Ws2_32")
    

    În exemplul următor ne vom conecta chiar la site-ul forumului, urmând ca, în subpunctul următor, să descărcăm conținutul acestui topic.

    Lucrul în rețea cuprinde mai mulți pași, putând apărea erori în cadrul oricăruia:

    • Inițializarea bibliotecii

      Înainte de orice apel către Winsock, biblioteca va trebui inițializată printr-un apel la funcția WSAStartup.
      Așa cum se observă din documentație, funcția acceptă 2 parametrii:
      • Versiunea cerută - 2.2 în acest caz
      • Un pointer spre o structură WSADATA ai cărei membrii vor fi inițializați cu informații cu privire la sistemul Winsock

      Pentru fiecare apel către WSAStartup, la final, va trebui apelat WSACleanup.

      În cazul unei inițializări reușite, funcția va returna 0, în caz contrar, ea returnând codul de eroare.

      WSADATA wsaData;
      if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
      {
      	_tprintf(_T("Eroare la inițializare."));
      	return EXIT_FAILURE;
      }
      /* ... codul aplicației ... */
      WSACleanup();
      
      

    • Specificarea destinației la care dorim să ne conectăm

      În acest exemplu dorim să accesăm prin TCP host-ul forum.softpedia.com port 80 (standard pentru HTTP). Toate aceste informații trebuiesc stocate într-o structură addrinfo.

      Se poate observa că în structura addrinfo trebuie specificată adresa IP și nu un nume de domeniu.

      Quote

      Cum aflu ce IP e asociat unui domeniu?

      Metoda modernă implică folosirea funcției getaddrinfo definită în Ws2tcpip.h.

      Aceasta acceptă 4 parametrii:

      • Adresa la care dorim să ne conectăm, sub forma unui șir de caractere ASCII: poate fi de forma "forum.softpedia.com" sau "1.2.3.4"
      • Tipul serviciului la care dorim să ne conectăm, sub forma unui șir de caractere ASCII: poate fi de forma "http" sau "80" (nu toate serviciile au asociate un port standard, respectiv nu le obligă nimeni să folosească în permanență portul standard)
      • O structură addrinfo drept sugestie: aici se poate specifica de exemplu că se doresc doar adrese IPv4 corespunzătoare unui domeniu
      • Un pointer spre o structură addrinfo care va conține rezultatul interogării

      Și returnează valoarea 0 în caz de succes.

      ADDRINFOA endPointParameters;
      ZeroMemory(&endPointParameters, sizeof(addrinfo));
      
      endPointParameters.ai_family = AF_INET; // IPv4
      endPointParameters.ai_socktype = SOCK_STREAM; // Stream
      endPointParameters.ai_protocol = IPPROTO_TCP; // TCP
      
      ADDRINFOA* endPoint;
      if (getaddrinfo("forum.softpedia.com", "http", &endPointParameters, &endPoint) != 0)
      {
      	_tprintf(_T("Eroare la determinarea punctului de conectare"));
      	WSACleanup();
      	return EXIT_FAILURE;
      }
      
      

    • Crearea unei variabile de tip SOCKET

      Așa cum în cazul citirii/scrierii pe disc avem un descriptor ținut minte într-o structură de tip FILE, în cazul comunicării pe net descriptorul se numește SOCKET și este obținut printr-un apel la funcția socket.

      Cei trei parametrii necesari acestei funcții îi avem deja din structura addrinfo.

      SOCKET sock = socket(endPoint->ai_family, endPoint->ai_socktype, endPoint->ai_protocol);
      
      if (sock == INVALID_SOCKET)
      {
      	_tprintf(_T("Socket-ul nu a putut fi creat"));
      	WSACleanup();
      	return EXIT_FAILURE;
      }
      
      

    • Conectarea la destinație

      Odată creat socket-ul, conectarea la destinația dorită se realizează folosind funcția connect.

      Această funcție acceptă drept parametrii: socket-ul, destinația și dimensiunea destinației.
      Dacă conectarea s-a realizat cu succes, funcția va returna 0.
      Programul va îngheța până când se realizează conectarea (ce poate dura și câteva secunde).

      if (connect(sock, endPoint->ai_addr, endPoint->ai_addrlen) != 0)
      {
      	_tprintf(_T("Conectarea nu s-a putut realiza"));
      	WSACleanup();
      	return EXIT_FAILURE;
      }
      
      

  • Creerea unui mini-client HTTP

    Odată realizată conexiunea nu ne mai rămâne de făcut decât să comunicăm cu serverul de la capătul celălalt.

    Quote

    Și cum zic server-ului că vreau http://forum.softped...omunica-pe-net/?

    Dacă încerc să mă conectez la forum.softpedia.com/topic/915170-dezvoltarea-aplicaiilor-ce-comunica-pe-net/ primesc eroare la aflarea IP-ului...

    Forma unui URL este:

    Wikipedia said:

    scheme://domain:port/path?query_string#fragment_id

    În cazul de față:
    • scheme este http - să știm ce "limbă" urmează să vorbim
    • domain este forum.softpedia.com - adresa server-ului
    • port este 80 - valoarea implicită, nu trebuie menționat
    • path este topic/915170-dezvoltarea-aplicaiilor-ce-comunica-pe-net/ - calea spre resursa ce o vom cere server-ului

    Protocolul HTTP este o convenție ce stabilește cum trebuie să arate mesajele transmise între client și server pentru ca aceștia să se înțeleagă. Este un protocol text, putând fi înțeles ușor și "cu ochiul liber".

    Cererea din acest exemplu arată în felul următor:

    Quote

    GET /topic/915170-dezvoltarea-aplicaiilor-ce-comunica-pe-net/ HTTP/1.0\n
    Host: forum.softpedia.com\n
    User-Agent: Primul meu client web\n\n

    După GET specificăm ce anume dorim (path?query_string) urmat de versiunea protocolului ce dorim să o utilizăm (1.0 pentru simplificare). În cazul versiunii 1.0 fiecare conexiune poate cere un singur lucru, versiunea 1.1 permițând ca într-o cerere să fie cerute, rând pe rând, mai multe (rezultând, de exemplu, o viteză mai bună pentru site-uri de conțin o mulțime de imagini mici).

    Parametrul următor, Host:, este unul foarte important: multe site-uri sunt găzduite în sistem shared, adică un server deservește n site-uri pe n domenii diferite. Prin simpla conectare la IP-ul server-ului, port 80, acesta nu va știi la care din cele n site-uri găzduite ne referim. Prin host este specificat acest lucru.

    Odată compusă cererea, bytes-ii acesteia sunt transmiși cu ajutorul funcției send. Această funcție returnează fie numărul de bytes care au fost transmiși, fie, în caz de eroare, SOCKET_ERROR.

    char toSend[] = 
    	"GET /topic/915170-dezvoltarea-aplicaiilor-ce-comunica-pe-net/ HTTP/1.0\n"
    	"Host: forum.softpedia.com\n"
    	"User-Agent: Primul meu client web\n\n";
    	
    int bytesSent;
    
    if ((bytesSent = send(sock, toSend, strlen(toSend), 0)) == SOCKET_ERROR)
    {
    	closesocket(sock);
    	WSACleanup();
    	_tprintf(_T("Error while sending data"));
    	return EXIT_FAILURE;
    }
    
    

    Odată transmisă cererea, urmează să citim răspunsul. Aceasta se va realiza cu ajutorul funcției recv.

    Funcției recv va trebui să-i dăm adresa unui buffer alocat de noi, împreuna cu dimensiunea acestuia, iar funcția va scrie datele primite din rețea în acest buffer, returnându-ne numărul de bytes ce au fost scriși. În cazul în care conexiunea a fost închisă din capătul celălalt, funcția va returna valoarea 0, iar în cazul unei valori negative înseamnă că a avut loc o eroare.

    char buffer[1025];
    int bytesReceived;
    
    while(true)
    {
    	bytesReceived = recv(sock, buffer, 1024, 0);
    	if (bytesReceived == 0)
    	{
    		_tprintf(_T("\r\nConexiunea a fost închisă"));
    		break;
    	}
    	else if (bytesReceived < 1)
    	{
    		_tprintf(_T("\r\nEroare la primirea datelor: %d", WSAGetLastError()));
    	}
    	else
    	{
    		buffer[bytesReceived] = '\0';
    		printf(buffer);
    	}
    }
    
    

    În acest exemplu, după fiecare n bytes primiți introduc valoarea '\0' și afișez mesajul pe ecran.
    Răspunsul arată în felul următor:

    Quote

    HTTP/1.0 200 OK
    Date: Sun, 17 Mar 2013 16:59:24 GMT
    Server: Apache
    Set-Cookie: sp_forumsession_id=74b...; path=/; domain=forum.softpedia.com; httponly
    Set-Cookie: sp_forummodpids=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=forum.softpedia.com
    Vary: Accept-Encoding
    X-Frame-Options: SAMEORIGIN
    Connection: close
    Content-Type: text/html;charset=ISO-8859-2

    <!DOCTYPE html>
    <html xml:lang="ro" lang="ro" xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    ...

    În prima parte a mesajului se specifică codul 200 (ce înseamnă, conform protocolului, OK). Urmează alte informații, iar după \n\n urmează conținutul efectiv al resursei cerute, codul HTML al paginii în acest caz. Acest conținut poate fi și binar, dacă este cerută o poză de exemplu.


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Temă propusă

Să se scrie o funcție care primește ca parametru o valoare double ce reprezintă o sumă în RON și care returneză valoarea în EURO, utilizând cursul valutar din ziua curentă, descărcat de pe un site.

double EURdinRON(double RON);


#3
#soryn

#soryn

    Junior Member

  • Grup: Members
  • Posts: 119
  • Înscris: 08.02.2007
In primul rand foarte reusit tutorialul. Acum am si eu cateva intrebari de incepator. Se pot obtine si altfel de informatii de la site-ul la care te conectezi, in afara de codul HTML ? De exemplu, daca as incerca sa rezolv exercitiul propus de tine, trebuie sa ma conectez la un site, sa ii descarc codul HTML si sa rasfoiesc pe acolo prin codul HTML pana gasesc informatia care ma intereseaza ? Nu se poate si mai usor ? Sau uite, daca ma conectez la http://cursvalutar.business24.ro/ acolo am informatii despre cursul valutar in functie de RON. Daca vreau sa il aflu in functie de dolar trebuie sa modific acolo moneda. Sau daca vreau sa il aflu pe la de ieri trebuie sa schimb data. Se poate face asta ? Daca da, cum ? Sau pot macar sa preiau doar textul de pe o pagina si nu intreg codul html ?

#4
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,596
  • Înscris: 30.07.2003
Conteaza ce fel de informatii furnizeaza site-ul cu pricina. Poate sa returneze o arhiva, un fisiel XML s.a.m.d. Toate astea le primesti si le folosesti adecvat. Pentru o prelucrare mai usoara a paginii web sunt acele biblioteci "HTML Parser" ce-ti fac viata mai usoara.
Sigur ca poti trimite o cerere cu parametrii adecvati sa obtii cursul valutar de ieri/alaltaieri/etc. din moment ce pagina o permite. Dar pentru asta trebuie sa stii HTTP & Co.

Edited by neagu_laurentiu, 07 April 2013 - 01:18.


#5
jadnycky

jadnycky

    Active Member

  • Grup: Members
  • Posts: 1,458
  • Înscris: 27.11.2010
Poti sa citesti numai textul daca tratezi marcajele HTML ca si comentarii. Ma gandeam ca in Plan 9, si retelele
sunt fisiere(si poate si alte resurse ca host-urile) si n-ar mai fi probleme cu tratarea protocolului.

#6
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,596
  • Înscris: 30.07.2003

View Postjadnycky, on 20 aprilie 2013 - 09:24, said:

n-ar mai fi probleme cu tratarea protocolului
12233 24544 3454333 2 24553 22 2344 23 456774

Ce am scris eu mai sus daca nu stii protocolul/la ce sa te astepti ?

Edited by neagu_laurentiu, 20 April 2013 - 09:32.


#7
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postneagu_laurentiu, on 20 aprilie 2013 - 09:32, said:

Ce am scris eu mai sus daca nu stii protocolul/la ce sa te astepti ?
În Plan9 nu l-ar interesa, după ce a obţinut FD-ul. Face Plan9 totul.

#8
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,596
  • Înscris: 30.07.2003
Am inteles.

Edited by neagu_laurentiu, 20 April 2013 - 10:27.


#9
repp4radu

repp4radu

    Member

  • Grup: Members
  • Posts: 459
  • Înscris: 14.01.2010
As dori sa fac o aplicatie care sa ma logheze pe forum, iar mai apoi sa pot posta de pe contul meu.
Nu sunt interesat de problemele de securitate la ora actuala, in contextul in care scopul este pur didactic.

Problemele care ma impiedica sa realizez aplicatia sunt urmatoarele:
1. Voi submita un query de tip POST la adresa destinata log in-ului. Probabil, prin mesajul transmis voi trimite perechi cheie-valoare pentru a indica userul si parola.
Cum va stii site-ul sa le interpreteze?
2. Odata autentificat, cand voi accesa alte pagini, va fi pastrata autentificarea? Cum ma pot folosi de cookies in C?
3. Intrebarea 1 legata de postarea pe un thread.

#10
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postrepp4radu, on 23 aprilie 2013 - 15:06, said:

1. Voi submita un query de tip POST la adresa destinata log in-ului. Probabil, prin mesajul transmis voi trimite perechi cheie-valoare pentru a indica userul si parola.
Cum va stii site-ul sa le interpreteze?
Nu ai cum să ştii, şi nu te interesează. Atâta timp cât le trimiţi aşa cum e specificat probabil într-un formular, ţi-ai făcut treaba de client, şi de aici încolo e treaba serverului să-ţi răspundă corespunzător.

View Postrepp4radu, on 23 aprilie 2013 - 15:06, said:

2. Odata autentificat, cand voi accesa alte pagini, va fi pastrata autentificarea?
Atâta timp cât îi spui serverului că tu eşti tu, da. Şi asta o faci trimiţând cookie-urile pornite de server.

View Postrepp4radu, on 23 aprilie 2013 - 15:06, said:

Cum ma pot folosi de cookies in C?
Nu te foloseşti de ele, cel puţin nu deocamdată, în cazul tău simplist, în care încă mai înveţi. Doar le trimiţi înapoi serverului aşa cum le-ai primit, în request header.

View Postrepp4radu, on 23 aprilie 2013 - 15:06, said:

3. Intrebarea 1 legata de postarea pe un thread.
Nu văd o problemă aici, nu ştiu ce să-ţi răspund.

Am luat la cunoştinţă.

#11
repp4radu

repp4radu

    Member

  • Grup: Members
  • Posts: 459
  • Înscris: 14.01.2010
Mi-am facut o idee despre cum ma pot autentifica si sa transmit apoi cookie-ul si am vrut sa ma pun pe implementat, dar iau eroare de compilare
Undefined reference to 'WSAStartup@8'.

Am inclus headerele: winsock2.h, ws2tcpip.h si windows.h.

Ce ar trebui sa fac sa pot compila? :-?

#12
msmihai

msmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 5,271
  • Înscris: 02.09.2006
Adauga dupa include-uri

#pragma comment(lib, "Ws2_32.lib")

Ai practic dependinta de aceasta librarie. In general, te uiti pe msdn sa vezi in ce librarie se regaseste fiecare functie.

Attached Files

  • Attached File  ws2.png   40.09K   39 downloads

Edited by msmihai, 26 April 2013 - 14:36.


#13
repp4radu

repp4radu

    Member

  • Grup: Members
  • Posts: 459
  • Înscris: 14.01.2010
tot asa face...

#14
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Acel #pragma e pentru Visual C++.
In cazul gcc folosesti
-lws2_32


#15
HurrleyProg

HurrleyProg

    Member

  • Grup: Validating
  • Posts: 279
  • Înscris: 15.03.2013
Un tutorial reusit. Felicitari !

#16
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Nu s-a incumetat nimeni sa rezolve tema? :)

#17
pale_and_pale

pale_and_pale

    Junior Member

  • Grup: Members
  • Posts: 187
  • Înscris: 11.07.2012
Salut. In primul rand tutorialul este foarte bun :).

Am creat o aplicatie-server care citeste mai intai un mesaj de la tastatura apoi il trimite fiecarei conexiuni cu mesaj de la capatul celalalt.
Pe urma am creat un client(care se conecteaza la localhost) programat sa citeasca un mesaj de la tastatura, sa il trimita serverului si apoi sa afiseze raspunsul (toate astea in ciclul while).
Problema e ca dupa ce am trimis primul mesaj si s-a afisat primul raspuns, clientul nu ma mai lasa sa scriu alte mesaje. Eroarea pare a fi de la soclu, dar serverul nu inchide celalalt punct dupa ce a transmis mesajul. Nu inteleg, cum as putea sa mentin conexiunea "permanenta" intre cei doi pana se inchide unul?
Am pus sursele mai jos.

Attached Files


Edited by pale_and_pale, 12 June 2013 - 10:30.


#18
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Unui client ii dai odata accept urmand ca apoi sa citesti folosind recv pana la inchiderea conexiunii. 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.

Pe partea client pare ok abordarea cat timp primesti raspuns doar dupa ce scrii tu un mesaj.

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

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