|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
[c\socket] migliorare sistema di connessione...
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
__________________
http://mamo139.altervista.org |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
ma perché fai la connessione in modalitá non bloccante e poi tutto il resto in modalitá bloccante?
![]() io ti consiglierei di usare la modalitá bloccante per tutto, é piu facile da usare; quella non bloccante la userei solo per necessitá specifiche. PS: per vedere se un indirizzo é l'indirizzo di loopback usa la costante INADDR_LOOPBACK |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
Per questo avevo pensato a fare la connect in modo non bloccante... tu come risolveresti il problema?? scusa non ho capito bene a cosa mi servirebbe INADDR_LOOPBACK
__________________
http://mamo139.altervista.org |
|
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
mi sembra che non ci sia nulla di specifico. Quote:
Codice:
if (*(struct in_addr*)ip.h_addr != INADDR_LOOPBACK) { // altro indirizzo } else { // 127.0.0.1 } |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:08.