Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
19/03/10 15:55
robrock80
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
 

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 19/03/10 15:57
aaa
19/03/10 21:46
HeDo
aaa
19/03/10 23:36
robrock80
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

int res;
do {
memset(resBuffer,'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


int res;
do {
memset(resBuffer,'{parsed_message}',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
recv(socket,resBuffer,(sizeof(char) * BUFFER_LENGTH),0);
e il processo rimane appeso: come risolvo questo problema?
',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
recv(socket,resBuffer,(sizeof(char) * BUFFER_LENGTH),0);
e il processo rimane appeso: come risolvo questo problema?
aaa
21/03/10 23:39
pierotofy
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 21/03/10 23:40
Il mio blog: piero.dev
22/03/10 9:40
robrock80
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
aaa
22/03/10 10:42
HeDo
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.
aaa
22/03/10 10:48
robrock80
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 22/03/10 10:49
aaa
22/03/10 10:54
HeDo
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 22/03/10 10:54
aaa