CavemanTcp vous offre le contrôle ultime dans la création d'applications basées sur TCP impliquant des clients et des serveurs.
Avec CavemanTcp, vous avez un contrôle total sur la lecture et l'écriture des données. CavemanTcp est conçu pour ceux qui souhaitent un contrôle explicite sur le moment où les données sont lues ou écrites ou qui souhaitent créer une machine à états au-dessus de TCP.
Important:
Étant donné que CavemanTcp s'appuie sur l'application consommatrice pour spécifier quand lire ou écrire, aucun thread d'arrière-plan ne surveille en permanence l'état de la connexion TCP (contrairement à SimpleTcp et WatsonTcp). Ainsi, vous devez créer vos applications en partant du principe qu'une exception peut être levée au milieu d'une lecture ou d'une écriture.
À partir de la version 1.3.0, la prise en charge de TCP keepalive a été ajoutée pour .NET Core et .NET Framework ; malheureusement, .NET Standard n'offre pas cette prise en charge, elle n'est donc pas présente pour les applications utilisant CavemanTcp ciblées sur .NET Standard.
Guid
au lieu de string ipPort
ListClients
renvoie désormais une énumération de ClientMetadata
Send
et Read
utilisant string ipPort
sont marquées comme obsolètesAddClient
s'est rapproché de l'acceptation de la connexionnet461
net472
net48
net6.0
net7.0
et 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
et ReadResult
contiennent une propriété Status
qui indique l'un des éléments suivants :
ClientNotFound
- applicable uniquement pour les opérations de lecture et d'écriture du serveurSuccess
- l'opération a réussiTimeout
- l'opération a expiré (réservé pour une utilisation future)Disconnected
: le pair est déconnecté WriteResult
comprend également :
BytesWritten
- le nombre d'octets écrits sur le socket. ReadResult
comprend également :
BytesRead
- le nombre d'octets lus sur le socket.DataStream
- un MemoryStream
contenant les données demandées.Data
- une représentation byte[]
de DataStream
. L’utilisation de cette propriété lira entièrement DataStream
jusqu’à la fin. IMPORTANT
127.0.0.1
comme adresse IP de l'écouteur, il ne pourra accepter que les connexions provenant de l'hôte local.null
, *
, +
ou 0.0.0.0
pour l'adresse IP de l'auditeur (nécessite des privilèges d'administrateur pour écouter sur n'importe quelle adresse IP) Lorsque vous utilisez l'une des API qui vous permettent de spécifier un délai d'attente (c'est-à-dire SendWithTimeout
, SendWithTimeoutAsync
, ReadWithTimeout
et ReadWithTimeoutAsync
), les résultats WriteResult
et ReadResult
mentionnés ci-dessus indiqueront si l'opération a expiré.
Il est important de comprendre ce qu'un timeout indique et, plus important encore, ce qu'il ne signifie pas.
NetworkStream
ou SslStream
sous-jacent.NetworkStream
ou SslStream
sous-jacent dans le nombre de millisecondes alloué.timeoutMs
sont -1
ou tout entier positif. -1
n'indique aucun délai d'attente et équivaut à utiliser une API qui ne spécifie pas de délai d'attenteBytesRead
ou BytesWritten
(si vous lisiez ou écriviez) en cas d'expiration du délai. Le délai d'attente peut s'être produit en cours d'opération et il sera donc important de se remettre de l'échec.ReadWithTimeout
a été lancé avec un délai d'attente de 10 secondes, tentant de lire 50 000 octets.ReadResult
avec Status == ReadResultStatus.Timeout
est renvoyé et la propriété BytesRead
est définie sur 30 000.NetworkStream
ou SslStream
sous-jacent du client.Depuis la version 1.3.0, la prise en charge des keepalives TCP a été ajoutée à CavemanTcp, principalement pour résoudre le problème de l'arrêt d'une interface réseau, du câble débranché ou de l'indisponibilité du support. Il est important de noter que les keepalives sont pris en charge dans .NET Core et .NET Framework, mais PAS dans .NET Standard. Depuis cette version, .NET Standard ne fournit aucune fonctionnalité pour les keepalives TCP.
Les keepalives TCP sont activés par défaut.
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
Quelques remarques importantes sur les keepalives TCP :
Keepalive.TcpKeepAliveRetryCount
s’applique uniquement à .NET Core ; pour .NET Framework, cette valeur est forcée à 10 Un merci spécial à ceux qui ont contribué à améliorer la bibliothèque jusqu'à présent !
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
Besoin d'aide ou d'un retour d'information ? Veuillez signaler un problème ici !
Veuillez vous référer à CHANGELOG.md.
Un merci spécial à VektorPicker pour l'icône gratuite Caveman : http://www.vectorpicker.com/caveman-icon_490587_47.html