Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] Socket

  1. #1

    [C] Socket

    Dovrei programmare usando i socket sotto Unix e volevo sapere se c'è qualche guida.

    E poi devo usare qualche libreria speciale????
    P.

  2. #2
    Se funziasse anche sotto winzozz o linux sarebbe perfetto!!
    P.

  3. #3
    qualcosa sul file sys/socket.h ..... :quipy:
    P.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    40
    library "speciale" ?!?!?!?!?!?!?!?!

    non è mica winsock2 !

    è tutto già a disposizione nel kernel, usa il comando man:

    > man socket
    > man gethostbyname

    se usi il kde, digita l'url man:/ nella location bar.

    comunque:

    codice:
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    ...
    
    // cerca l'host
    struct in_addr host;
    struct hostent* ip = gethostbyname("www.html.it");
    host.s_addr=*(int*)(ip->h_addr);
    
    // crea il socket
    int sock = socket(AF_INET,SOCK_STREAM,0);
    
    // lo connette all'host
    struct sockaddr_in sai;
    sai.sin_family=PF_INET;
    sai.sin_port=htons(((short)80));
    memcpy(&sai.sin_addr,host,sizeof(*host));
    
    connect(sock,(struct sockaddr*)&sai,sizeof(sai));
    
    // il gioco è fatto:
    
    FILE* fp = fdopen(sock, "rw");
    
    // manda un comando HTTP
    fprintf(fp, "HEAD / HTTP/1.1\r\n\r\n");
    
    // legge la risposta
    char buf[255];
    do
    {
      fgets(buf, 255, fp);
      printf("%s", buf);
    }
    while(buf[0] != '\r');
    
    // chiude
    fclose(fp);
    naturalmente non è testato...
    ciao

  5. #5
    -> Stevens, "Unix Network Programming"

  6. #6
    occhio se devi scrivere codice funzionante anche in windows, una socket in windows non e' un descrittore di file.

    Ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    40
    comunque se usi direttamente i winsock (NON la classe wrapper MFC CSocket) l'interfaccia di basso livello è più o meno uguale.

    l'interfaccia CSocket è un insulsa: funziona tutta a messaggi e se sei bloccato ad esempio in lettura non puoi terminare il CWinThread che detiene il message loop.
    Naturalmente c'è la CancelBlockingCall ma se la usi devi stare molto più attento ai deadlock tra thread e ai memory leaks; e per evitare memory leaks in chiusura di un thread devi fare un join sul thread... un casino.

  8. #8
    Ciao,

    Per la portabilita' tra windows e unix credo che basti avere l'avvertenza di usare solo send e recv per invio e ricezione, anche se sono scomodissimi, considerare le differenze tra fcntl o ioctl e la controparte windows ioctlsocket, usare delle define per close / closesocket, delle define per evitare di confondere il tipo SOCKET di windows con il tipo file descriptor (int) di Unix, definire INVALID_SOCKET -1 in Unix, uno wrapper per errno / GetLastError(). Per le socket non bloccanti usare delle select (vedi man) con dei timeout.

    Quanto ho detto e' da dimostrare, ma sembra funzionare, comunque.

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.