Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92

    [C] insesperienza con le socket

    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;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    A patto che l'host sia il computer stesso (127.0.0.1) direi di no.
    Ah, sì, non avevo fatto caso ...
    codice:
    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:
    codice:
    recv(sock, mess, sizeof(char), 0);
    Riceve un singolo carattere di risposta dal socket, non l'intera risposta.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92
    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).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.