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 connection
Einige 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