Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Socket in C
Forum - C/C++ - Socket in C

Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 17:40
Domenica, 10/04/2011
Continuano i miei studi riguardo i socket, ma fino ad adesso, senza successo;

Se avvio questo programma:
Codice sorgente - presumibilmente C++

  1. /**
  2.   Socket Linux, programmazione di rete
  3.   @Author       Hack
  4.   @Website      www.methack.it
  5.   @Reference: http://www.methack.it/devblog/2008/08/31/socket-linux-programmazione-di-rete
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #include <unistd.h>
  14.  
  15. int main(int argc, char *argv[])
  16. {
  17.         int SPORT = 80;                 // Porta TCP Server
  18.         char IP[] = "google.it/index.html";     // Indirizzo IP Server
  19.  
  20.         int server, err, byte;
  21.         struct sockaddr_in server_addr;
  22.         char buffer[100];
  23.  
  24.         //      Creazione del socket
  25.         server = socket(AF_INET, SOCK_STREAM, 0);
  26.  
  27.         //      Struttura relativa alle informazioni sul Server
  28.         server_addr.sin_family          = AF_INET;
  29.         server_addr.sin_port            = htons((u_short)SPORT);
  30.         server_addr.sin_addr.s_addr     = inet_addr(IP);
  31.  
  32.         printf("\n\nConnessione in corso...\n");
  33.  
  34.         //      La funzione connect() restituisce un codice di errore
  35.         err = connect (server, (struct sockaddr *)&server_addr, sizeof(server_addr));
  36.         if(err == 0)
  37.         {
  38.                 printf ("Connessione avvenuta\n");
  39.                 send (server,"Ciao Server",13,0);
  40.                 recv (server, buffer, 20, 0);
  41.                 printf ("\nServer: %s", buffer);
  42.  
  43.         }
  44.         else
  45.         {
  46.                 perror (buffer);
  47.         }
  48.  
  49.         printf("\n\n");
  50.  
  51.         //      Chiusura socket
  52.         close(server);
  53. }


Mi esce fuori:
Codice sorgente - presumibilmente C/C++

  1. pitagora@laptop:~$ ./try
  2.  
  3.  
  4. Connessione in corso...
  5. Network is unreachable
  6.  
  7.  
  8. pitagora@laptop:~$


Dove sbaglio?


Yep, I came back :P
PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 18:51
Domenica, 10/04/2011
se non sbaglio inet_addres vuole una stringa in forma decimale puntata (x.x.x.x) no credo che un indirizzo tipo www.google.it vada bene, prima devi passarlo al resolver che ti da l'indirizzo.
quindi:

prova per il momento ad usare un indirizzo tipo 127.0.0.1 a vedere se funziona,
e poi, se vuoi usare indirizzi alfanumerici devi fare:

Codice sorgente - presumibilmente C/C++

  1. #include <netdb.h>
  2. struct hostent *indirizzo_alfanum;
  3. int indirizzo;
  4. indirizzo_alfanum= gethostbyname("www.google.it");
  5.  
  6. indirizzo=*((int *)he->h_addr_list[0]);



hostent è una struttura che, quando viene chiamato gethostbyname contiene vari campi, fra cui l'indirizzo..cerca su google per maggiori dettagli

ciao!


Alex=)
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6109
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:54
Domenica, 10/04/2011
Come ha detto Alex... inet_addr prende una stringa che rappresenta un indirizzo IP, non un hostname.

Codice sorgente - presumibilmente C/C++

  1. char IP[] = "google.it/index.html";     // Indirizzo IP Server



Fail, "google.it/index.html" non è un indirizzo IP (e nemmeno un hostname), è un URL.

Cambia in:

Codice sorgente - presumibilmente C/C++

  1. char IP[] = "74.125.225.19";     // Indirizzo IP Server



E riprova.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 20:30
Domenica, 10/04/2011
grazie mille :k:

Ultimo quesito: per eseguire l'upload di un file su un FTP, una volta collegato ed autenticato, come mi devo comportare? E per fare invece il download di un file, sempre su FTP?


Yep, I came back :P
PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 21:20
Domenica, 10/04/2011
devi mandargli delle stringhe secondo le specifiche del protocollo ftp..
cerca su google "ftp telnet" e trovi un migliaio di guide..


Alex=)
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:58
Lunedì, 11/04/2011
ho trovato questa fantastica documentazione: http://nsftools.com/tips/RawFTP.htm Noto anche con piacere che è presente il codice STORE nome_file.remoto

Adesso il problema sta nel capire, dopo che invio questo codice
Codice sorgente - presumibilmente Plain Text

  1. send(socketfd, "STORE nome_file.remoto", sizeof("STORE nome_file.remoto");


come mi devo comportare per iniziare a inviare il vero file???


Yep, I came back :P
PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 19:12
Martedì, 12/04/2011
da quel che ho capito leggendo in giro per internet bisogna, dopo aver mandato il comando spedirgli i vari byte del file, quindi

Codice sorgente - presumibilmente C/C++

  1. char c;
  2. source=fopen("file.dat","rb");
  3. while(fread(&c,sizeof(c),1,source)==1)
  4.    send(sock,&c,sizeof(c),0);
  5.  
  6. fclose(source);



c'è da dire che sul sito dove ho trovato queste indicazioni (spiegavano come farlo in c#, ma mi pare di aver capito che si faccia così) dicevano di caricare prima in un buffer tutto il file e poi spedirlo.
questo non mi sembra molto bello da fare, specialmente se i file sono di grosse dimensioni. però puoi sempre provare se non ti viene come ti ho detto io ad allocarti un bel buffer della dimensione del file e poi spedirlo.


Alex=)
PM Quote