Socket.Listen Frage

16/07/2008 - 21:37 von Olli Goessler | Report spam
Hi Leute,

ich habe wieder mal eine Frage an Euch Spezialisten: (C# - .NET FW 2.0)
Beim realisieren einer Server-Client Kommunikation mit der Auflage das
sowohl Server wie auch Client einen Abbruch der Verbindung zu erkennen hat
habe ich ein kleines Problem: Ein Disconnect vom Server oder Client ist klar
zu erkennen, wenn ich aber einen Netzausfall mittels abstecken der Cat5/6 RJ
45 Verbindung simuliere erfreut sich der Server an einer Connection die er
danach nicht mehr hat.
Mein derzeitiger und einziger Einfall waere das kontinuierliche senden eines
Life-Packets mit Replay vom Client, bleibt dieses aus ist es mit der
Verbindung aus -:))
Allerdings moechte ich das nur implementieren wenn es wirklich keine andere
Moeglichkeit gibt eine derartige Unterbrechung der Verbindung zu eruieren.
Vielleicht habt Ihr dazu schon Erfahrungen und/oder Ideen gesammelt und
koenntet mir dazu ein paar Tips geben.

Und da ich schon mal dabei bin, noch eine weitere Frage: Was ich derzeit
auch noch nicht richtig hinbringe ist die 1-Server 1-Client Variante, wenn
ich mit einem Client am Server verbunden bin und mich mit einem zweiten
Client zum Server verbinde dann waere mein Wunsch das der zweite Client bei
dem Versuch des verbindens vom Listener abgewiesen wird: MAX_CLIENTS = 1 ...
Vielleicht koennt Ihr meine Unverstaendnis erleuchten.

// Start listening
this.m_MainSocket.Listen(MAX_CLIENTS);
// Create the call back for any client connections, for this case only one
this.m_MainSocket.BeginAccept(new AsyncCallback(this.OnClientConnect),
null);

private void OnClientConnect(IAsyncResult asyn)
{
try
{
if (this.m_Clients.Count < MAX_CLIENTS)
{
this.m_Clients.Add(this.m_MainSocket.EndAccept(asyn));
this.WaitForData(this.m_Clients[this.m_Clients.Count - 1]);
}

this.m_MainSocket.BeginAccept(new AsyncCallback(this.OnClientConnect),
null);

// Fire the event if client connected
if (this.OnClientConnection != null)
this.OnClientConnection.Invoke((byte)this.m_Clients.Count);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", " OnClientConnection: Socket
has been closed");
}
}


Vielen Dank und liebe Gruesse
Olli
 

Lesen sie die antworten

#1 Thomas Scheidegger
16/07/2008 - 22:22 | Warnen spam
Hallo Olli

Netzausfall mittels abstecken der Cat5/6 RJ45 Verbindung simuliere



am Client-PC?
(denn lokaler disconnect sollte gemeldet werden [aktuelle OS/SP/Drv/Fx])

Life-Packets mit Replay vom Client



TCP-Timeouts sind default (und dies systemweit per Registry!)
meist schon recht lange bis Minuten-Bereiche,
ohne Datentransfer gar bis Stunden (je nach SO_KEEPALIVE).
Ein eigener 'Ping'-Mechanismus ist AFAIK meist die einzige Lösung.


des verbindens vom Listener abgewiesen wird: MAX_CLIENTS = 1



es gibt da (mind. unter Windows) gewisse Randbedingungen/Probleme.
Vermutlich musst du selber 'mitzàhlen' und ggf per Close abweisen...
(ist in den Details auch primàr ein Win32-Winsock Thema, nicht .NET)

Normal ist eine Beschrànkung auf 1:1 aber eh nicht.



Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen