CavemanTcp oferece o controle máximo na construção de aplicativos baseados em TCP envolvendo clientes e servidores.
Com CavemanTcp, você tem controle total sobre a leitura e gravação de dados. CavemanTcp foi projetado para aqueles que desejam controle explícito sobre quando os dados são lidos ou gravados ou desejam construir uma máquina de estado sobre TCP.
Importante:
Como o CavemanTcp depende do aplicativo consumidor para especificar quando ler ou escrever, não há threads em segundo plano monitorando continuamente o estado da conexão TCP (ao contrário do SimpleTcp e do WatsonTcp). Portanto, você deve criar seus aplicativos na expectativa de que uma exceção possa ser lançada no meio de uma leitura ou gravação.
A partir da v1.3.0, o suporte de manutenção de atividade TCP foi adicionado para .NET Core e .NET Framework; infelizmente o .NET Standard não oferece esse suporte, portanto ele não está presente para aplicativos que usam CavemanTcp direcionados ao .NET Standard.
Guid
em vez da string ipPort
ListClients
agora retorna uma enumeração de ClientMetadata
Send
e Read
usando string ipPort
são marcados como obsoletosAddClient
aproximou-se da aceitação da conexãonet461
net472
net48
net6.0
net7.0
e 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
e ReadResult
contêm uma propriedade Status
que indica um dos seguintes:
ClientNotFound
- aplicável apenas para operações de leitura e gravação do servidorSuccess
- a operação foi bem sucedidaTimeout
- a operação expirou (reservada para uso futuro)Disconnected
- o par desconectado WriteResult
também inclui:
BytesWritten
- o número de bytes gravados no soquete. ReadResult
também inclui:
BytesRead
- o número de bytes lidos do soquete.DataStream
- um MemoryStream
contendo os dados solicitados.Data
- uma representação byte[]
de DataStream
. O uso desta propriedade fará a leitura completa DataStream
até o fim. IMPORTANTE
127.0.0.1
como endereço IP do ouvinte, ele só poderá aceitar conexões de dentro do host local.null
, *
, +
ou 0.0.0.0
para o endereço IP do ouvinte (requer privilégios de administrador para escutar em qualquer endereço IP) Ao usar qualquer uma das APIs que permitem especificar um tempo limite (ou seja, SendWithTimeout
, SendWithTimeoutAsync
, ReadWithTimeout
e ReadWithTimeoutAsync
), o WriteResult
e ReadResult
resultantes, conforme mencionado acima, indicarão se a operação expirou.
É importante entender o que um tempo limite indica e, mais importante, o que não indica.
NetworkStream
ou SslStream
subjacente.NetworkStream
ou SslStream
subjacente no número alocado de milissegundostimeoutMs
são -1
ou qualquer número inteiro positivo. -1
indica que não há tempo limite e é o mesmo que usar uma API que não especifica um tempo limiteBytesRead
ou BytesWritten
(se você estava lendo ou escrevendo) no caso de um tempo limite. O tempo limite pode ter ocorrido no meio da operação e, portanto, será importante recuperar-se da falha.ReadWithTimeout
foi iniciado com um tempo limite de 10 segundos, tentando ler 50.000 bytesReadResult
com Status == ReadResultStatus.Timeout
é retornado e a propriedade BytesRead
é definida como 30.000NetworkStream
ou SslStream
subjacente do clienteA partir da v1.3.0, o suporte para keepalives TCP foi adicionado ao CavemanTcp, principalmente para resolver o problema de desligamento de uma interface de rede, cabo desconectado ou indisponibilidade da mídia. É importante observar que os keepalives são suportados no .NET Core e no .NET Framework, mas NÃO no .NET Standard. A partir desta versão, o .NET Standard não oferece recursos para manutenção de atividade TCP.
As manutenções de atividade TCP são habilitadas por padrão.
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
Algumas notas importantes sobre manutenção de atividade TCP:
Keepalive.TcpKeepAliveRetryCount
só é aplicável ao .NET Core; para .NET Framework, esse valor é forçado para 10 Um agradecimento especial àqueles que ajudaram a melhorar a biblioteca até agora!
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
Precisa de ajuda ou tem feedback? Por favor, registre um problema aqui!
Consulte CHANGELOG.md.
Agradecimentos especiais ao VektorPicker pelo ícone gratuito do Caveman: http://www.vectorpicker.com/caveman-icon_490587_47.html