21. Mär 2012 13:48 C/C++ connect() timeout ändern (Windows)hallo, ich bin auf der suche nach einem beispielquelltext in dem der "connect()" timeout auf z.B. 2 sekunden gelegt ist. um der frage vorzubeugen, ob ich denn den quelltext am PC hätte: MfG |
21. Mär 2012 14:51 habs grade geschafft xDhab so lange rumprobiert... wens interessiert:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 #include <winsock2.h> 5 6 7 int main(int argc, char *argv[]) 8 { 9 WORD wVersionRequested; 10 WSADATA wsaData; 11 char *IP = "XXX.XXX.X.XXX"; // eigene IP 12 int PORT = 80; 13 struct sockaddr_in client; 14 unsigned long addr; 15 struct timeval Timeout; 16 SOCKET sock; 17 struct hostent *host_info; 18 u_long iMode = 1; 19 int nStatus; 20 21 FD_SET FDSet; 22 FD_ZERO( &FDSet ); 23 FD_SET( sock, &FDSet ); 24 25 Timeout.tv_sec = 1; 26 Timeout.tv_usec = 0; 27 28 wVersionRequested = MAKEWORD (2,2); 29 WSAStartup (wVersionRequested, &wsaData); 30 31 32 memset( &client, 0, sizeof (client)); 33 if ((addr = inet_addr(IP)) != INADDR_NONE) 34 { 35 memcpy( (char *)&client.sin_addr, &addr, sizeof(addr)); 36 } 37 else 38 { 39 host_info = gethostbyname(IP); 40 if (host_info!=NULL) 41 { 42 memcpy( (char *)&client.sin_addr, 43 host_info->h_addr, host_info->h_length ); 44 } 45 } 46 client.sin_family = AF_INET; 47 client.sin_port = htons( PORT ); 48 49 50 sock = socket( AF_INET, SOCK_STREAM, 0); 51 ioctlsocket(sock, FIONBIO,&iMode); 52 53 if (connect(sock,(struct sockaddr*)&client,sizeof(client)) 54 !=SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) 55 { 56 printf("nicht verbunden"); 57 } 58 59 select( 1, NULL, &FDSet, NULL, &Timeout ); 60 if ( nStatus == SOCKET_ERROR ) 61 { 62 printf("nicht verbunden"); 63 } 64 else if ( nStatus == 0 ) 65 { 66 printf("nicht verbunden"); 67 } 68 else 69 { 70 printf("verbunden"); 71 } 72 73 74 closesocket(sock); 75 WSACleanup(); 76 77 } |
21. Mär 2012 23:28 ree
wo wird diese Variable gesetzt? Ansonsten wuerden mich deine erfahrungen mit der select methode interessieren. Habe selbst vor kurzem bei einem projekt mit WSAEventSelect experimentiert, und ueberlege auf "select" umzusteigen. |
22. Mär 2012 12:50 sdfdsfsdfsfsfhabs bevor ichs gepostet hab versucht alles n bisschen übersichtlicher zu machen. FD_SET FDSet; ghört sich auch weiter nach unten. habs erst mit SIG_ALARM usw. versucht.. aber ist keine saubere lösung. so solltes jetz richtig sein:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 #include <winsock2.h> 5 6 7 int main(int argc, char *argv[]) 8 { 9 WORD wVersionRequested; 10 WSADATA wsaData; 11 char *IP = "XXX.XXX.X.XXX"; // eigene IP 12 int PORT = 80; 13 struct sockaddr_in client; 14 unsigned long addr; 15 struct timeval Timeout; 16 SOCKET sock; 17 struct hostent *host_info; 18 u_long iMode = 1; 19 int nStatus; 20 21 22 Timeout.tv_sec = 1; 23 Timeout.tv_usec = 0; 24 25 wVersionRequested = MAKEWORD (2,2); 26 WSAStartup (wVersionRequested, &wsaData); 27 28 29 memset( &client, 0, sizeof (client)); 30 if ((addr = inet_addr(IP)) != INADDR_NONE) 31 { 32 memcpy( (char *)&client.sin_addr, &addr, sizeof(addr)); 33 } 34 else 35 { 36 host_info = gethostbyname(IP); 37 if (host_info!=NULL) 38 { 39 memcpy( (char *)&client.sin_addr, 40 host_info->h_addr, host_info->h_length ); 41 } 42 } 43 client.sin_family = AF_INET; 44 client.sin_port = htons( PORT ); 45 46 47 sock = socket( AF_INET, SOCK_STREAM, 0); 48 ioctlsocket(sock, FIONBIO,&iMode); 49 50 if (connect(sock,(struct sockaddr*)&client,sizeof(client)) 51 !=SOCKET_ERROR 52 && WSAGetLastError() != WSAEWOULDBLOCK) 53 { 54 printf("nicht verbunden"); 55 } 56 57 FD_SET FDSet; 58 FD_ZERO( &FDSet ); 59 FD_SET( sock, &FDSet ); 60 61 nStatus = select( 1, NULL, &FDSet, NULL, &Timeout ); 62 if ( nStatus == SOCKET_ERROR ) 63 { 64 printf("nicht verbunden"); 65 } 66 else if ( nStatus == 0 ) 67 { 68 printf("nicht verbunden"); 69 } 70 else 71 { 72 printf("verbunden"); 73 } 74 75 76 closesocket(sock); 77 WSACleanup(); 78 79 } |
