Avatar billede dsj Nybegynder
12. juni 2003 - 19:12 Der er 16 kommentarer og
1 løsning

TCP med Socket

Sikrer en socket-forbindelse ikke, at en forbindelse er åben og hvis ikke at der smides en exception af en slags (evt. SocketException eller IOException)? Altså er det ikke noget der ligger i TCP-protokollen, at det opdages, hvis forbindelse afbrydes pga. jordskælv, atomangreb, eller at ledningen unplugges?
Avatar billede repsak Nybegynder
12. juni 2003 - 19:14 #1
Hmmm TCP protokollen SIKRER ikke at en forbindelse er åben. Den sikrer blot at ALLE data når frem. Hvis ikke - SÅ får du en exception
Avatar billede repsak Nybegynder
12. juni 2003 - 19:15 #2
Hvis TCP skulle kontrollere om en forbindelse er åben hele tiden vil det koste unødige ressourcer
Avatar billede arne_v Ekspert
12. juni 2003 - 19:17 #3
Hvad er åben ?

Jeg mener ikke at der er nogen i-am-alive packets d.v.s. at
problemer først opdages når man forsøger at bruge conncetion.
Avatar billede dsj Nybegynder
12. juni 2003 - 19:21 #4
Omformulering:

Kan en socket være åben selvom forbindelsen er afbrudt. Jeg ved godt at der bliver smidt exceptions, men kan det i visse, sjældne tilfælde lade sig gøre, eller smides er det konsekvent synligt i ALLE tilfælde? F.eks. kan det ses at forbindelsen er blevet afbrudt, hvis der gennem input-strømmen modtages '-1' i det uendelige...
Avatar billede repsak Nybegynder
12. juni 2003 - 19:23 #5
Mener du hvad der sker hvis en etableret forbindelse afbrydes (?????)
Avatar billede arne_v Ekspert
12. juni 2003 - 19:25 #6
Hvis ikke du bruger socket, så opdager du aldrig at forbindelsen
er afbrudt.

Hvis du bruger socket bør du altid  få en exception.

[men det er også mennesker der har kodet java og tcp/ip stack]
Avatar billede dsj Nybegynder
12. juni 2003 - 19:36 #7
"[men det er også mennesker der har kodet java og tcp/ip stack]" -> som gør?

Jeg bruger jo konstant min socket idet den er blocked i read() på input-strømmen.
Avatar billede dsj Nybegynder
12. juni 2003 - 19:38 #8
Nu sidder jeg og udvikler den er multiplayer-server - og min kolleger foreslår en ping-mekanisme, hvor klienterne pinger serveren, og hvis serveren så ikke modtager noget fra klienterne i et minuts tid, bliver de disconnected (Socket.setSoTimeout).

Jeg vil bare mene at det er spil af trafik, hvis jeg kan være sikker på at det altid vil blive opdaget...
Avatar billede arne_v Ekspert
12. juni 2003 - 19:38 #9
At de også kan lave fejl.

:-)
Avatar billede dsj Nybegynder
12. juni 2003 - 19:39 #10
hvem kan også lave fejl - jeg er vidst ikke med :)
Avatar billede arne_v Ekspert
12. juni 2003 - 19:42 #11
En write bør altid kunne detecte fejl fordi den aldrig får en ACK.

En read ? Jeg har svært ved at se hvordan den kan detecte om den
anden ikke sender noget eller linien er gået !

Men det er lidt uden for mit ekspertise område.
Avatar billede arne_v Ekspert
12. juni 2003 - 19:44 #12
Det var bare et forbehold. En ting er hvad TCP/IP principielt kan - der er
ingen garanti for at alt er implementeret korrekt.
Avatar billede dsj Nybegynder
12. juni 2003 - 19:45 #13
read() vil i nogle tilfælde modtage -1, hvis forbindelsen er afbrudt. I andre tilfælde smides en SocketException: Connection reset by peer.
Avatar billede arne_v Ekspert
12. juni 2003 - 22:33 #14
Jeg kender en TCP/IP haj - jeg prøver at spørge ham.
Avatar billede dsj Nybegynder
13. juni 2003 - 00:42 #15
:D
Avatar billede s.nielsen Nybegynder
28. juli 2003 - 01:33 #16
Uanset om du får en exception eller read returnerer -1 kan du vel tolke det som om klienten er logget af/forbindelsen er gået tabt. Hvis dit problem er at read kaldet aldrig returnerer fordi der (mod forventning) ikke er noget at læse, skal du bruge den nye non-blocking io tilføjelse der kom i version 1.4 i stedet for setSoTimeout()
Avatar billede dsj Nybegynder
28. juli 2003 - 08:17 #17
Jeg er nemlig også siden da gået over til at bruge NIO, som skulle være mere sikkert i opdagelsen af afbrudte forbindelser. Det har bare siden givet tusind andre problemer, som dog efterhånden er blevet løst, men ikke alle...
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