PDA

Visualizza la versione completa : [C] Inesperienza con le socket


salvio78
05-03-2006, 01:37
scusate secondo voi cosa c'è che non va nel seguente listato
che dovrebbe inviare a un host un comando http e ricevere da esso le informazioni stampandole a video (premetto sono molto inesperto di winsock e non programmo in C da una vita).

#include <windows.h>
#include <winsock.h> //includo le varie librerie tra cui quella winsock
#include <stdio.h>
#include <string.h>


int main()
{
SOCKET sock; // creo la socket chiamato sock che userò
nella connessione
struct sockaddr_in sock_addr; // inizializzo la socket
WSADATA data; // inizializzo la variabile che contiene le
primitive di Winsock
WORD p;
p=MAKEWORD(2,0); // creo la variabile p che contiene la
versione della wsock32.dll
WSAStartup(p,&data); // inizializzo la wsock32.dll
verificandone la mancanza di errori
char *comando = "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\n\r\n"; //invio chiamata all host

char *mess; //variabile per la risposta


sock=socket(PF_INET,SOCK_STREAM,0); // creo la socket
indicandone le
caratteristiche
sock_addr.sin_family=PF_INET; // indico il protocollo
utilizzato (TCP/IP)
sock_addr.sin_port=htons(80); //indico la porta a cui
connettere la socket
sock_addr.sin_addr.S_un.S_un_b.s_b1=127; // indico
l'indirizzo IP
sock_addr.sin_addr.S_un.S_un_b.s_b2=0;
sock_addr.sin_addr.S_un.S_un_b.s_b3=0;
sock_addr.sin_addr.S_un.S_un_b.s_b4=1;

connect(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr)); // mi connetto all'indirizzo scelto

send( sock, comando , strlen(comando), 0); //invio comando
tramite protocollo http

recv(sock, mess, sizeof(char), 0); //ricezione dalla socket
della risposta

printf("%s", mess); //stamapa a video risultato

closesocket(sock); // chiudo la socket
WSACleanup(); //libero le risorse utilizzate dalla libreria Winsock

system("PAUSE");
return 0;
}

pprllo
05-03-2006, 12:15
A patto che l'host sia il computer stesso (127.0.0.1) direi di no.
Ah, sì, non avevo fatto caso ...


send( sock, comando , strlen(comando), 0);

Non invia il terminatore null (tutta la stringa è di strlen(stringa)+1 caratteri, quindi dovresti scrivere quello nel parametro len).
Poi:


recv(sock, mess, sizeof(char), 0);

Riceve un singolo carattere di risposta dal socket, non l'intera risposta.

salvio78
05-03-2006, 13:50
più o meno ho risolto introducendo per la risposta una stringa creata dinamivamente con malloc.

il punto e che non capisco come struturale recv per far si che il programma finisca di richiedere recv(quando ha letto tutto dalla socket).

Loading