
CavemanTcp gibt Ihnen die ultimative Kontrolle beim Erstellen von TCP-basierten Anwendungen mit Clients und Servern.
Mit CavemanTcp haben Sie die volle Kontrolle über das Lesen und Schreiben von Daten. CavemanTcp wurde für diejenigen entwickelt, die explizit steuern möchten, wann Daten gelesen oder geschrieben werden, oder eine Zustandsmaschine auf TCP aufbauen möchten.
Wichtig:
Da CavemanTcp darauf angewiesen ist, dass die konsumierende Anwendung angibt, wann gelesen oder geschrieben werden soll, gibt es keine Hintergrundthreads, die den Status der TCP-Verbindung kontinuierlich überwachen (im Gegensatz zu SimpleTcp und WatsonTcp). Daher sollten Sie bei der Erstellung Ihrer Apps davon ausgehen, dass während eines Lese- oder Schreibvorgangs möglicherweise eine Ausnahme ausgelöst wird.
Ab v1.3.0 wurde TCP-Keepalive-Unterstützung für .NET Core und .NET Framework hinzugefügt; Leider bietet .NET Standard diese Unterstützung nicht und ist daher nicht für Apps verfügbar, die CavemanTcp verwenden, die auf .NET Standard ausgerichtet sind.
Guid statt durch string ipPort verwiesenListClients gibt jetzt eine Aufzählung von ClientMetadata zurückSend und Read , die string ipPort verwenden, sind als veraltet markiertAddClient ist der Verbindungsannahme näher gekommennet461 net472 net48 net6.0 net7.0 und net8.0 using CavemanTcp ;
// Instantiate
TcpServer server = new TcpServer ( "127.0.0.1" , 8000 , false , null , null ) ;
server . Logger = Logger ;
// Set callbacks
server . Events . ClientConnected += ( s , e ) =>
{
Console . WriteLine ( "Client " + e . Client . ToString ( ) + " connected to server" ) ;
} ;
server . Events . ClientDisconnected += ( s , e ) =>
{
Console . WriteLine ( "Client " + e . Client . ToString ( ) + " disconnected from server" ) ;
} ;
// Start server
server . Start ( ) ;
// Send [Data] to client at [guid]
Guid guid = Guid . Parse ( "00001111-2222-3333-4444-555566667777" ) ;
WriteResult wr = null ;
wr = server . Send ( guid , "[Data]" ) ;
wr = server . SendWithTimeout ( [ ms ] , guid , "[Data]" ) ;
wr = await server . SendAsync ( guid , "[Data]" ) ;
wr = await server . SendWithTimeoutAsync ( [ ms ] , guid , "[Data]" ) ;
// Receive [count] bytes of data from client at [guid]
ReadResult rr = null ;
rr = server . Read ( guid , [ count ] ) ;
rr = server . ReadWithTimeout ( [ ms ] , guid , count ) ;
rr = await server . ReadAsync ( guid , [ count ] ) ;
rr = await server . ReadWithTimeoutAsync ( [ ms ] , guid , [ count ] ) ;
// List clients
List < ClientMetadata > clients = server . GetClients ( ) . ToList ( ) ;
// Disconnect a client
server . DisconnectClient ( guid ) ; using CavemanTcp ;
// Instantiate
TcpClient client = new TcpClient ( "127.0.0.1" , 8000 , false , null , null ) ;
client . Logger = Logger ;
// Set callbacks
client . Events . ClientConnected += ( s , e ) =>
{
Console . WriteLine ( "Connected to server" ) ;
} ;
client . Events . ClientDisconnected += ( s , e ) =>
{
Console . WriteLine ( "Disconnected from server" ) ;
} ;
// Connect to server
client . Connect ( 10 ) ;
// Send data to server
WriteResult wr = null ;
wr = client . Send ( "[Data]" ) ;
wr = client . SendWithTimeout ( [ ms ] , "[Data]" ) ;
wr = await client . SendAsync ( "[Data]" ) ;
wr = await client . SendWithTimeoutAsync ( [ ms ] , "[Data]" ) ;
// Read [count] bytes of data from server
ReadResult rr = null ;
rr = client . Read ( [ count ] ) ;
rr = client . ReadWithTimeout ( [ ms ] , count ) ;
rr = await client . ReadAsync ( [ count ] ) ;
rr = await client . ReadWithTimeoutAsync ( [ ms ] , [ count ] ) ; WriteResult und ReadResult enthalten eine Status , die eines der folgenden angibt:
ClientNotFound – gilt nur für Server-Lese- und SchreibvorgängeSuccess – die Operation war erfolgreichTimeout – der Vorgang ist abgelaufen (reserviert für zukünftige Verwendung)Disconnected : Der Peer ist nicht verbunden WriteResult umfasst außerdem:
BytesWritten – die Anzahl der in den Socket geschriebenen Bytes. ReadResult umfasst außerdem:
BytesRead – die Anzahl der vom Socket gelesenen Bytes.DataStream – ein MemoryStream der die angeforderten Daten enthält.Data – eine byte[] -Darstellung von DataStream . Durch die Verwendung dieser Eigenschaft wird DataStream vollständig bis zum Ende gelesen. WICHTIG
127.0.0.1 als Listener-IP-Adresse angeben, kann dieser nur Verbindungen vom lokalen Host aus akzeptieren.null , * , + oder 0.0.0.0 für die Listener-IP-Adresse (erfordert Administratorrechte, um jede IP-Adresse abzuhören). Wenn Sie eine der APIs verwenden, die es Ihnen ermöglichen, eine Zeitüberschreitung anzugeben (z. B. SendWithTimeout , SendWithTimeoutAsync , ReadWithTimeout und ReadWithTimeoutAsync ), geben die resultierenden WriteResult und ReadResult wie oben erwähnt an, ob beim Vorgang eine Zeitüberschreitung aufgetreten ist.
Es ist wichtig zu verstehen, was eine Zeitüberschreitung bedeutet und noch wichtiger, was sie nicht bedeutet.
NetworkStream oder SslStream schreiben konnte oder nichtNetworkStream oder SslStream lesen kanntimeoutMs sind -1 oder eine beliebige positive Ganzzahl. -1 gibt an, dass kein Timeout vorliegt, und entspricht der Verwendung einer API, die kein Timeout angibtBytesRead oder BytesWritten (wenn Sie gelesen oder geschrieben haben). Die Zeitüberschreitung kann mitten im Betrieb aufgetreten sein und daher ist es wichtig, den Fehler zu beheben.ReadWithTimeout mit einem Zeitlimit von 10 Sekunden initiiert, bei dem versucht wurde, 50.000 Bytes zu lesenReadResult mit Status == ReadResultStatus.Timeout wird zurückgegeben und die BytesRead Eigenschaft wird auf 30.000 gesetztNetworkStream oder SslStream des ClientsAb Version 1.3.0 wurde CavemanTcp Unterstützung für TCP-Keepalives hinzugefügt, hauptsächlich um das Problem zu beheben, dass eine Netzwerkschnittstelle heruntergefahren, das Kabel abgezogen wird oder das Medium aus anderen Gründen nicht mehr verfügbar ist. Es ist wichtig zu beachten, dass Keepalives in .NET Core und .NET Framework unterstützt werden, NICHT jedoch in .NET Standard. Ab dieser Version bietet .NET Standard keine Funktionen für TCP-Keepalives.
TCP-Keepalives sind standardmäßig aktiviert.
server . Keepalive . EnableTcpKeepAlives = true ;
server . Keepalive . TcpKeepAliveInterval = 5 ; // seconds to wait before sending subsequent keepalive
server . Keepalive . TcpKeepAliveTime = 5 ; // seconds to wait before sending a keepalive
server . Keepalive . TcpKeepAliveRetryCount = 5 ; // number of failed keepalive probes before terminating connectionEinige wichtige Hinweise zu TCP-Keepalives:
Keepalive.TcpKeepAliveRetryCount gilt nur für .NET Core; Für .NET Framework wird dieser Wert auf 10 erzwungen Ein besonderer Dank geht an diejenigen, die bisher zur Verbesserung der Bibliothek beigetragen haben!
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
Benötigen Sie Hilfe oder haben Sie Feedback? Bitte reichen Sie hier ein Problem ein!
Weitere Informationen finden Sie unter CHANGELOG.md.
Besonderer Dank geht an VektorPicker für das kostenlose Caveman-Symbol: http://www.vectorpicker.com/caveman-icon_490587_47.html