Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Come si ricevono i dati dal server via socket?
Forum - C/C++ - Come si ricevono i dati dal server via socket?

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 16:55
Venerdì, 19/03/2010
Questo topic è stato chiuso dal moderatore

Salve a tutti. Stò studiando i socket su windows e ho creato un progetto: sono riuscito a inviare i dati al server, ma non sò come ricevere la risposta da quest'ultimo (all'interno del codice ho indicato dove mi aspetto la risposta) poichè non ho un riferimento al socket del server e non sò neanche come ottenerlo. Vi posto il codice
Codice sorgente - presumibilmente C++

  1. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  2.         char *webServer = "127.0.0.1";
  3.         int webPort = 80;
  4.         SOCKET socket = initClientSocket(webServer, webPort);
  5.         char buffer[256];
  6.         cout << "\n\n";
  7.         while(TRUE) {
  8.                 cout << "\tDigita comando\n\t\t";
  9.                 cin.getline(buffer, BUFFER_LENGTH-1, '\n');
  10.                 cin.clear();
  11.                 cin.sync();
  12.                 if (0 == strcmpi(buffer, "exit")) {
  13.                         break;
  14.                 }
  15.                 send(socket , buffer,lstrlen(buffer),0);
  16.                
  17. //Qui dovrei ricevere una risposta
  18.  
  19.         }
  20.         closesocket(socket);
  21.         return 1;
  22. }
  23.  
  24.  
  25. SOCKET initClientSocket(char *pHost, int iPort){
  26.         struct sockaddr_in saClient;
  27.         struct hostent *pHostinfo;
  28.         SOCKET sock;
  29.         WORD version;
  30.         WSADATA WSAData;
  31.         version=MAKEWORD(1,1);
  32.         WSAStartup(version, &WSAData);
  33.         if ((sock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){
  34.                 return 0;
  35.         }
  36.         pHostinfo=gethostbyname(pHost);
  37.         if (pHostinfo==NULL){
  38.                 return 0;
  39.         }
  40.         saClient.sin_family=AF_INET;
  41.         saClient.sin_addr=*((struct in_addr *)pHostinfo->h_addr);
  42.         saClient.sin_port=htons(iPort);
  43.         if (connect(sock,(struct sockaddr *)&saClient, sizeof(saClient))){
  44.                 return 0;
  45.         }
  46.         return sock;
  47. }


Ultima modifica effettuata da robrock80 il 19/03/2010 alle 16:57
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 22:46
Venerdì, 19/03/2010

PM
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 0:36
Sabato, 20/03/2010
Ok, funziona. Ora sono di fronte a un nuovo problema: sono riuscito a collegare una shell remota al socket: per ricevere la risposta ho scritto il seguente ciclo

Codice sorgente - presumibilmente C/C++

  1. int res;
  2. do {
  3. memset(resBuffer,'\0',BUFFER_LENGTH);
  4. res = recv(socket,resBuffer,(sizeof(char) * BUFFER_LENGTH),0);
  5. } while(res > 0);



dopo aver ricevuto la risposta della shell (Microsoft Windows versione... etc) al terzo giro si blocca alla chiamata
Codice sorgente - presumibilmente Plain Text

  1. recv(socket,resBuffer,(sizeof(char) * BUFFER_LENGTH),0);

e il processo rimane appeso: come risolvo questo problema?

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 0:39
Lunedì, 22/03/2010
Devi spostare il codice che si occupa di leggere dalla socket in un thread separato. Guarda la funzione CreateThread su MSDN.

Ultima modifica effettuata da pierotofy il 22/03/2010 alle 0:40


Il mio blog: https://piero.dev
PM
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 10:40
Lunedì, 22/03/2010
Grazie Piero, poi avevo risolto (nella stessa maniera in cui mi hai detto tu)... Qualcuno poi mi aveva detto di usare la funzione di settaggio del timeout di recv, ma non ha funzionato

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 11:42
Lunedì, 22/03/2010
Testo quotato

Postato originariamente da robrock80:

Qualcuno poi mi aveva detto di usare la funzione di settaggio del timeout di recv, ma non ha funzionato  



perchè hai sbagliato ad usarla.

PM
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 11:48
Lunedì, 22/03/2010
Codice sorgente - presumibilmente C/C++

  1. struct timeval tv;
  2. tv.tv_sec = 2;
  3. tv.tv_usec = 0;
  4. setsockopt( socket, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv, sizeof ( tv ) );



... Nonostante ciò la shell remota in alcuni casi si bloccava e l'unica soluzione è stata creare un thread

Ultima modifica effettuata da robrock80 il 22/03/2010 alle 11:49
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 11:54
Lunedì, 22/03/2010
sicuramente c'è qualche altro problema da un'altra parte, il buon funzionamento delle api win32 è da prendere come assioma della programmazione. Poi ovviamente ci sono i casi in cui failano, ma bisogna sempre considerare la regola, non l'eccezione improbabile.

Ultima modifica effettuata da HeDo il 22/03/2010 alle 11:54
PM
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 17:24
Lunedì, 22/03/2010
Ti è mai capitato che la shell DOS si blocchi e per sbloccarla devi premere il tasto invio?
Beh a me è capitato qualche volta. Ma il problema è che se comunichi via socket con una shell remota accade continuamente. Quindi mi pare che queste api di Windows qualche piccolo problema ce l'hanno e comunque mai dare per scontate le cose. Insomma, se sono così perfette come mai escono continuamente patch per il sistema operativo???

Ultima modifica effettuata da robrock80 il 22/03/2010 alle 17:35
PM
Pagine: [ 1 2 ] Precedente | Prossimo