questo è il modo con cui mi connetto in un mio programma.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);
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![]()

Rispondi quotando