Autore Topic: dead  (Letto 2424 volte)

Offline legacy

  • ASM Lover
  • *****
  • Post: 353
  • Karma: +14/-2
    • Mostra profilo
dead
« il: 17 Gennaio 2015, 21:55:09 »
dead
« Ultima modifica: 17 Gennaio 2020, 23:42:22 da legacy »

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re:linux bello per il networking ? buauauauhahahahahahah
« Risposta #1 il: 17 Gennaio 2015, 22:04:24 »
Purtroppo conosco questo problema. E' un bordello immane, soprattutto quando devi scrivere codice multipiattaforma. :-\

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
Re:linux bello per il networking ? buauauauhahahahahahah
« Risposta #2 il: 17 Gennaio 2015, 23:47:14 »
Come dice la risposta a serverfault, quel stato è richiesto dal RFC 793 ed è definito essere di 4 minuti.

Quindi il comportamento è giusto secondo la specifica; se Windows chiude il socket senza attendere quel tempo, allora è un suo errore nell'implementazione.

Se questo problema ti capita perchè stai debuggando l'implementazione del server del tuo protocollo, puoi temporaneamente cambiare porta a ogni prova (tanto dopo i 4 minuti puoi tornare a usare quella iniziale).
Se invece il problema è nel normale utilizzo del tuo protocollo, dovresti cambiarlo in modo che sia il client a iniziare la chiusura, in questo modo il server non deve entrare in TIME-WAIT.

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
Re:linux bello per il networking ? buauauauhahahahahahah
« Risposta #3 il: 18 Gennaio 2015, 02:16:42 »
Il problema di chiudere brutalmente il socket di listening e renderlo libero è che potrebbe avviarsi un programma immediatamente dopo la terminazione del server, e iniziare a parlare col client che ancora crede di essere connesso al server originale; il timeout serve proprio a garantire che anche l'altra parte abbia ricevuto la conferma della chiusura della connessione.

Un male necessario insomma. :(

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re:linux bello per il networking ? buauauauhahahahahahah
« Risposta #4 il: 18 Gennaio 2015, 06:45:54 »
Ma i 4 minuti non ti garantiscono nulla: è un valore arbitrario che è stato messo lì per mettere una pezza al problema, che rimane irrisolto. E che crea, in ogni caso, altri casini.

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
Re:linux bello per il networking ? buauauauhahahahahahah
« Risposta #5 il: 18 Gennaio 2015, 16:02:27 »
Ma i 4 minuti non ti garantiscono nulla: è un valore arbitrario che è stato messo lì per mettere una pezza al problema, che rimane irrisolto. E che crea, in ogni caso, altri casini.

Mica devi dirlo a me; dillo a quelli che nel 1981 hanno scritto l'RFC del TCP. :D
L'attesa almeno "garantisce" che l'altro socket, che se proprio per sfortuna non riceve la conferma della chiusura, vada in timeout e si chiuda da solo. Non è la soluzione migliore ma il protocollo è questo.

quindi a maggior ragione la soluzione che ho proposto  :D

init <-------------- apre il socket lato server, ci fa la bind, ma non la listen
while(1)
{
open <----------------- fa una listen & accept per un solo client, apre il socket per parlare con il client
….
get
put <------------------ parla con il client, sul socket aperto per parlare col client
peg
...
close <------------------ chiude il socket con cui parlava con il client
}
done <--------------- chiude il socket lato server su cui si metteva in ascolto di connect di possibili client

Eh vabbè, ma questo è IL modo per fare il server (per come sono fatti i socket BSD); se la parte interna del while la metti in una funzione, non viene tutta sta complessità che millanti. :P
Se poi usi REUSEADDR (nota: addr), puoi chiudere e riaprire il server subito senza aspettare il timeout (utile durante lo sviluppo e debug).

Tags: