robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
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++ |
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char *webServer = "127.0.0.1"; int webPort = 80; SOCKET socket = initClientSocket(webServer, webPort); char buffer[256]; cout << "\n\n"; while(TRUE) { cout << "\tDigita comando\n\t\t"; cin.getline(buffer, BUFFER_LENGTH-1, '\n'); cin.clear(); cin.sync(); if (0 == strcmpi(buffer, "exit")) { break; } send(socket , buffer,lstrlen(buffer),0); //Qui dovrei ricevere una risposta } closesocket(socket); return 1; } SOCKET initClientSocket(char *pHost, int iPort){ struct sockaddr_in saClient; struct hostent *pHostinfo; SOCKET sock; WORD version; WSADATA WSAData; version=MAKEWORD(1,1); WSAStartup(version, &WSAData); if ((sock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){ return 0; } pHostinfo=gethostbyname(pHost); if (pHostinfo==NULL){ return 0; } saClient.sin_family=AF_INET; saClient.sin_addr=*((struct in_addr *)pHostinfo->h_addr); saClient.sin_port=htons(iPort); if (connect(sock,(struct sockaddr *)&saClient, sizeof(saClient))){ return 0; } return sock; }
|
Ultima modifica effettuata da robrock80 il 19/03/2010 alle 16:57 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
|
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
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++ |
int res;
do {
memset(resBuffer,'\0',BUFFER_LENGTH);
res = recv(socket,resBuffer,(sizeof(char) * BUFFER_LENGTH),0);
} 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 |
recv(socket,resBuffer,(sizeof(char) * BUFFER_LENGTH),0);
|
e il processo rimane appeso: come risolvo questo problema?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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
|
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
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
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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. |
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
Codice sorgente - presumibilmente C/C++ |
struct timeval tv;
tv.tv_sec = 2;
tv.tv_usec = 0;
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 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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 |
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
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 |
|