PDA

Visualizza la versione completa : [C] Socket in C


Ippolito Nievo
24-05-2010, 09:58
Ciao a tutti, avrei la necessità di controllare lo stato della connessione ad internet in C. Uso un sistema operativo Linux (Debian). Ho pensato di usare i socket, ma non li conosco bene e sto facendo fatica ad andare avanti. Mi basta solo verificare la connessione, non devo fare nient'altro. Se qualcuno può darmi una mano, o proporre qualche alternativa...

Intanto ringrazio!

Ippolito Nievo
24-05-2010, 12:06
Ho trovato la risposta, magari qualcuno ne avesse bisogno. Il codice per rilevare la connessione è il seguente:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
//"in" per "sockaddr_in"
#include <netinet/in.h>
//"netdb" per "gethostbyname"
#include <netdb.h>
//#include "main.h"


void ChiudiSocket(int sock){
close(sock);
return;
}


int CreaSocket(char* Destinazione, int Porta){
struct sockaddr_in temp;
struct hostent *h;
int sock;
int errore;

//Tipo di indirizzo
temp.sin_family=AF_INET;
temp.sin_port=htons(Porta);
h=gethostbyname(Destinazione);
if (h==0){
printf("Gethostbyname fallito\n");
return -1;
}
printf("Gethostbyname Eseguito\n");
bcopy(h->h_addr,&temp.sin_addr,h->h_length);
//Creazione socket.
sock=socket(AF_INET,SOCK_STREAM,0);
//Connessione del socket. Esaminare errore per compiere relative azioni.
errore=connect(sock, (struct sockaddr*) &temp, sizeof(temp));
if (errore!=0){printf("Errore Ricevuto n: %d\n",errore);}
else {printf("Connessione presente\n");}
//Chiudo il socket.
ChiudiSocket(sock);
return errore;
}

int verificaSocket(){
int errore=0;
//Creo e connetto il socket
errore=CreaSocket("208.69.34.231",80); //www.google.it
return errore;
}




se qualcuno vuole migliorare questo codice è sempre gradito...comunque funziona!

antotan
24-05-2010, 12:27
Se l'host che hai indicato o il web server è down dovrebbe restituirti errore lo stesso, anche se la colpa non è tua.
Premettendo che non ho mai affrontato l'argomento, per ottenere qualcosa del genere forse dovresti utilizzare i raw socket o la libreria Pcap.

linoma
24-05-2010, 16:35
Ce un gethost... che ritorna il proprio IP. Forse se nn si è connessi potrebbe dare errori.
Cmq la funzione contatta i servers dei nomi, quindi cmq fa quello che è stato postato.

Ippolito Nievo
24-05-2010, 18:12
quindi tu dice che con gethost ottengo l'indirizzo IP? potresti farmi un esempio di come usarlo?

simo_us
24-05-2010, 21:42
Se ti interessa ci sono 2 ottimi libri che riguardano la programmazione di socket BSD..
Unix Network Programming & Defintive Guide to Linux Network Programming
Ciascuno dei 2 va bene, anche se il secondo è più "completo e profondo"..
:ciauz:

Loading