Server-Client-Verbindung - System.Net.Sockets.TcpClient / NetworkStream

28/07/2008 - 22:10 von Andrea Müller | Report spam
Hallo,

folgendes großes Problem
Ich muss mich als Client an einen Kundenserver hàngen, verbinden.
Bei Start meiner App mache ich Open, beim Schließen Close

a) Wie bekomme ich mit, dass der Server nicht mehr da ist?
Irgendwie ein Event ausgelöst werden, oder? Beispiel...
b) Wie kann ich vor dem Schreiben prüfen, ob die Verbindung noch
steht?
Wàre vermutlich einfacher, oder?
c) Wenn die Verbindung nicht steht, wie baut man die Verbindung wieder
auf?

Grüße Andrea

private System.Net.Sockets.TcpClient XML_TcpClient;
private System.Net.Sockets.NetworkStream XML_NetworkStream;

A)
ClientOpen( )
try
{
XML_TcpClient = new System.Net.Sockets.TcpClient();
XML_TcpClient.Connect( StructConfigBASY.ServerCustomer,
StructConfigBASY.PortCustomer );
XML_NetworkStream = XML_TcpClient.GetStream();

//throw ( new System.SystemException( "Fehler Customer -
XML_ClientOpen()" ));

return 0;
}
catch ( ArgumentNullException e )
{
System.Diagnostics.Debug.Assert( false, e.Message );
System.Diagnostics.Debug.WriteLine( "ArgumentNullException:
{0}", e.Message );

return -1;
}


B)
public int ClientClose( )
{
//return 0;
try
{
XML_TcpClient.Close();

if ( null != XML_NetworkStream )
XML_NetworkStream.Close();

return 0;
}
catch ( ArgumentNullException e )
{
System.Diagnostics.Debug.Assert( false, e.Message );
System.Diagnostics.Debug.WriteLine( "ArgumentNullException:
{0}", e.Message );
return -1;
}

C)
if ( true == NetworkStream.CanWrite )
{
DataAvailable();
XML_NetworkStream.Write( arrRequest, 0, arrRequest.Length );
 

Lesen sie die antworten

#1 Thomas Scheidegger
28/07/2008 - 22:37 | Warnen spam
Hallo Andrea


Wie bekomme ich mit, dass der Server nicht mehr da ist?



was heisst 'nicht mehr da'?
1.) Damit man mitbekommt, wenn die Gegenstation ihren Socket (ordentlich)
schliesst,
sollte man stets eine Recv/Read-Operation pendent halten (sync oder
async).
Rückgabewert Lesegrösse = 0 [Stream-Ende].

2.) Aber wenn die Gegenstation stirbt oder abgehàngt/unterbrochen wurde,
kann es sehr lange Timeouts (min/std) geben.
Wenn man solches kurzfristiger mitbekommen muss,
dann hilft fast nur ein eigener, regelmàssiger Ping-Alive Test
(Anfrage/Antwort).

Beachte hier auch Socket.Shutdown oà.


Wie kann ich vor dem Schreiben prüfen, ob die Verbindung noch steht?



gibt es so nicht wirklich.
[zB TcpClient.Connected ist was anderes, lies dazu MSDN genau]
Den Schreibvorgang starten und ggf tritt dann halt irgendwann Exception auf.
Plus parallel dazu wiederum: stets eine Recv/Read-Operation pendent halten,
so bekommt man ein Session-Ende am besten mit.
[bzw man erkennt die ausbleibenden Ping-Alive Tests]



Wenn die Verbindung nicht steht, wie baut man die Verbindung wieder auf?



eine (ordentlich oder mit Fehler) beendete Session
kann nur per Close und dann neuem Connect/Accept wieder aufgebaut werden.



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

Ähnliche fragen