Avatar billede Swift Praktikant
02. april 2003 - 11:01 Der er 14 kommentarer og
1 løsning

socket connect() timeout ???

Hejsa

Jeg har en lille stump kode der kan connecte til en specificeret server - blot for at se om den er levende.
Problemet er bare at hvis IP adressen der testes op imod SLET ikke svarer på noget som helst - så går der 15-30 sekunder før connect() funktionen giver op.

Kan man lave noget smart kode der max. venter 1 sekund før den giver op ??

Nogle gode foreslag / eller evt. fungerende kode...?
Avatar billede jpk Nybegynder
02. april 2003 - 11:05 #1
Hvordan ser din kode ud?
Måske der er en membervariabel der bestemmer timeout..?
Avatar billede arne_v Ekspert
02. april 2003 - 11:05 #2
Hvis jeg husker rigtigt er det:

struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
setsockopt(s , SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
Avatar billede Swift Praktikant
02. april 2003 - 17:13 #3
ARNE_V:
Det ændrer ikke noget...
Jeg har endda prøvet at sætte begge timeouts:

struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof( timeout ) );
setsockopt( s, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof( timeout ) );
Avatar billede hsloth Novice
02. april 2003 - 18:52 #4
Så vidt jeg husker har SO_RCVTIMEO og SO_SNDTIMEO kun virkning på en socket forbindelse der er etableret.

Jeg tror det letteste er at bruge non-blocking sockets og så selv implementere det time out du vil acceptere.
Avatar billede Swift Praktikant
03. april 2003 - 09:02 #5
Vil det sige at non-blocking også kan indstilles så "connect()" returnerer MED DET SAMME - og at man så senere kan teste på om socket'et er blevet oprettet korrekt...?

Har du evt. et eks?
Avatar billede Swift Praktikant
03. april 2003 - 09:11 #6
Hm... jeg testede lige selv...jeg tilføjede dette lige før connect:

unsigned long a = 1;
unsigned long *aa= &a;
if( ioctlsocket( s, FIONBIO, aa ) != 0 )
{
    cout << "DEN KUNNE IKKE GØRES NON-BLOCKING!!!!\n";
}

Men programmet hænger fast på connect() hvis jeg fx. giver en IP på en server der ikke svarer....så NON-BLOCKING er åbenbart også kun på forbindelser der ER etableret...

Er der nogle der har andre ideer?
Evt. noget med UDP....kan det måske virke??
Avatar billede Swift Praktikant
07. april 2003 - 13:47 #7
ER DER IKKE ANDRE GODE FORESLAG ??????
Avatar billede segmose Nybegynder
16. april 2003 - 07:53 #8
OS og compiler? skal den connecte, can du selv ændre i serveren så
du ikke behøver at connecte men kan bruge noget UDP istedet???
Avatar billede Swift Praktikant
16. april 2003 - 17:09 #9
W2K og MS Visual Studio .NET

Jeg vil egentlig gerne bare lave et lille program der afgør om en specificeret IP adresse er DØD eller LEVENDE - så hvis det kan gøres med UDP - fint.

Bare kom med et eksempel!!
Avatar billede arne_v Ekspert
16. april 2003 - 17:16 #10
Hvorfor pinger du den så ikke bare (altså fra dit program) ?
Avatar billede Swift Praktikant
16. april 2003 - 20:14 #11
Af flere grunde...

1. Maskinen sidder bag en firewall - der er lukket for ping.

2. Maskinen er ikke en maskine - men 3. Og i fremtiden måske 10.
Via firewallen kan man jo godt fortælle at port 5001 skal gå til PC1, 5002 til PC2 o.s.v.
Men det kræver jo lige et lille program.

Jeg har set flere programmer (fx. ServersAlive) der kan se om en ting er levende.
Men jeg skal bruge et MEGET LILLE program - fordi der skal generes grafer over hvornår en maskine har været tilgængelig.
Avatar billede arne_v Ekspert
16. april 2003 - 20:19 #12
Nu kender jeg ikke dine firewall administratorer men de fleste jeg
kender ville flippe totalt ud over at skulle lukke op for
en 3-10 non-standard porte for UDP.

Men jeg kan selvfølgelig godt se at ping ikke er løsningen.

Der er ikke mulighed for at vende problem-stillingen så de 3-10
maskine connecter og fortæller at de er i live ? Bare et vildt
skud i tågen.
Avatar billede Swift Praktikant
17. april 2003 - 10:29 #13
Jeg vil helst have det "smarte" samlet 1 sted...derfor 1 server der tester de andre.
Avatar billede segmose Nybegynder
23. april 2003 - 10:47 #14
Work around
Opret en tråd med connect i dit program, set en timer i en anden tråd
hvis tråd 1 ikke svar inden 1 sek. skyd tråd 1 og din server :)
Avatar billede Swift Praktikant
23. april 2003 - 21:01 #15
Tja, nu har jeg bare ikke arbejdet så meget med tråde endnu...men jeg ser lige på det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester