codice:
struct sockaddr_in sock; //la struttura per il socket
int s;
fd_set fds;
struct timeval timeout;
struct hostent ip; //la struttura per l'indirizzo
unsigned long cmd;
WORD wVersion;
WSADATA wsaData;
wVersion = MAKEWORD(2, 2);
WSAStartup(wVersion, &wsaData); //winsock startup
s = socket(AF_INET, SOCK_STREAM, 0);
cmd=1; // imposto modalità socket non boccante (andrà gestita con select())
ioctlsocket( s, FIONBIO, &cmd);
// dati per Select
timeout.tv_sec = connect_timeout; // numero di secondi per il timeout
timeout.tv_usec = 0; // numero di microsecondi per il timeout
FD_ZERO(&fds);
FD_SET(s, &fds); // aggiungo s all'elenco dei socket gestiti da select
sock.sin_addr.S_un.S_un_b.s_b1=ip1; // indico l'indirizzo IP
sock.sin_addr.S_un.S_un_b.s_b2=ip2;
sock.sin_addr.S_un.S_un_b.s_b3=ip3;
sock.sin_addr.S_un.S_un_b.s_b4=ip4;
sock.sin_port = htons(ipport); //porta
if(ip1==127 && ip2==0 && ip3==0 && ip4==1){ //se vogliamo utilizzare il nostro ip
ip = *(gethostbyname(host)); // indico l'indirizzo
memcpy(&sock.sin_addr, ip.h_addr, ip.h_length); //copia l'indirizzo nella struttura socket
}
sock.sin_family = AF_INET;
connect(s, (struct sockaddr *)&sock, sizeof(sock)); //ci connettiamo
if (select(s+1, 0, &fds, 0, &timeout)>0){ //riusciamo a stabilire la connessione
cmd=0;//ripristino socket bloccante
ioctlsocket( s, FIONBIO, &cmd);
questo è il modo con cui mi connetto in un mio programma.
ha un problema: è lento, ci mette sempre almeno il tempo impostato nella variabile connect_timeout a ricevere i dati dalla connessione.
A me piacerebbe fare una connessione che se il server al quale mi connetto è attivo io gli mando subito e lui risponde subito, se il server non c'è quando è trascorso il tempo connect_timeout proseguiamo con il programma.
Come posso migliorare quindi questo codice che funziona ma è troppo lento??
Grazie mille