spin.de · die Community: Diskussions-Forum und Chat - Lern nette Leute kennen!

» Kostenlos anmelden
Sitemap
: C/C++ connect() timeout ändern (Windows)
Gitarrist.-
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.
wenn ich programme im lokalen netzwerk verwende machts wenig sinn ca. 20 sekunden timeout zu haben, weil normalerweise
die verbindung nach ca. 500 ms oder auch weniger steht.
in google hab ich einiges über "setsockopt()", "non-blocking sockets" und "select()" gelesen.
letzteres ist wohl eher für linux geeignet.
da ich aber unter windows programmiere hab ich mich an setsockopt versucht, bin aber bis jetzt immer gescheitert, obwohl ich glaube die parameter richtig angegeben zu haben... compiler bringt keine fehler.. aber das heißt ja nicht immer, dass kein fehler vorliegt. außerdem war ich mir nicht so ganz sicher ob das die richtige funktion dafür ist, da ja als mögliche paramter nur SO_RCVTIMEO und SO_SNDTIMEO in frage kommen. für mich hat dass dann wohl aber eher was mit send() und recv() zu tun...
aber ich lass mich gerne belehren :P

um der frage vorzubeugen, ob ich denn den quelltext am PC hätte:
nein leider nicht. ich hab mich da dran ca. 1 woche versucht und habs iwann aufgegeben und den quelltext gelöscht.
is schon ne zeit lang her und jetz hab mir gedacht, ob mir hier vill. jmd helfen kann.

MfG



Möchtest du mitreden?     Kostenlos Anmelden

Gitarrist.-
21. Mär 2012 14:51

habs grade geschafft xD

hab so lange rumprobiert...
jetzt poste ich des und kurz danach hab ichs hinkriegt xD
peinlich.. :P
ich denke ich hab immer zuerst select und dann erst connect verwendet.. das war wohl der fehler

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 }


RetiCence männlich
Jan aus Landau a d Isar (Bayern)
21. Mär 2012 23:28

ree

int nStatus;

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.



Gitarrist.-
22. Mär 2012 12:50

sdfdsfsdfsfsf

habs bevor ichs gepostet hab versucht alles n bisschen übersichtlicher zu machen.
sind n paar fehler drin gwesen..

FD_SET FDSet;
FD_ZERO( &FDSet );
FD_SET( sock, &FDSet );

ghört sich auch weiter nach unten.
und nStatus is result von select().

habs erst mit SIG_ALARM usw. versucht.. aber ist keine saubere lösung.
select find ich allgmein recht gut, wenn man versteht wies funktioniert.
im inet is schwierig richtig gute erklährungen zu finden. und wenn, dann meistens für linux.
man muss sich des alles selber zammbasteln für windows.
bei mir funktioniert des programm jetz wie gewollt.
also eigentlich recht gut, wenn auch kompliziert und nicht wirklich für windows gedacht.

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 }