CavemanTcp gives you the ultimate control in building TCP-based applications involving clients and servers.
With CavemanTcp, you have full control over reading and writing data. CavemanTcp is designed for those that want explicit control over when data is read or written or want to build a state machine on top of TCP.
Important:
Since CavemanTcp relies on the consuming application to specify when to read or write, there are no background threads continually monitoring the state of the TCP connection (unlike SimpleTcp and WatsonTcp). Thus, you should build your apps on the expectation that an exception may be thrown while in the middle of a read or write.
As of v1.3.0, TCP keepalive support was added for .NET Core and .NET Framework; unfortunately .NET Standard does not offer this support, so it is not present for apps using CavemanTcp targeted to .NET Standard.
Guid
instead of string ipPort
ListClients
now returns an enumeration of ClientMetadata
Send
and Read
methods using string ipPort
are marked obsoleteAddClient
moved closer to connection acceptancenet461
net472
net48
net6.0
net7.0
and 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
and ReadResult
contains a Status
property that indicates one of the following:
ClientNotFound
- only applicable for server read and write operationsSuccess
- the operation was successfulTimeout
- the operation timed out (reserved for future use)Disconnected
- the peer disconnectedWriteResult
also includes:
BytesWritten
- the number of bytes written to the socket.ReadResult
also includes:
BytesRead
- the number of bytes read from the socket.DataStream
- a MemoryStream
containing the requested data.Data
- a byte[]
representation of DataStream
. Using this property will fully read DataStream
to the end.IMPORTANT
127.0.0.1
as the listener IP address, it will only be able to accept connections from within the local host.null
, *
, +
, or 0.0.0.0
for the listener IP address (requires admin privileges to listen on any IP address)When using any of the APIs that allow you to specify a timeout (i.e. SendWithTimeout
, SendWithTimeoutAsync
, ReadWithTimeout
, and ReadWithTimeoutAsync
), the resultant WriteResult
and ReadResult
as mentioned above will indicate if the operation timed out.
It is important to understand what a timeout indicates and more important what it doesn't.
NetworkStream
or SslStream
NetworkStream
or SslStream
in the allotted number of millisecondstimeoutMs
are -1
or any positive integer. -1
indicates no timeout and is the same as using an API that doesn't specify a timeoutBytesRead
or BytesWritten
(if you were reading or writing) in the event of a timeout. The timeout may have occurred mid-operation and therefore it will be important to recover from the failure.
ReadWithTimeout
was initiated with a 10 second timeout, attempting to read 50,000 bytesReadResult
with Status == ReadResultStatus.Timeout
is returned, and the BytesRead
property is set to 30,000NetworkStream
or SslStream
As of v1.3.0, support for TCP keepalives has been added to CavemanTcp, primarily to address the issue of a network interface being shut down, the cable unplugged, or the media otherwise becoming unavailable. It is important to note that keepalives are supported in .NET Core and .NET Framework, but NOT .NET Standard. As of this release, .NET Standard provides no facilities for TCP keepalives.
TCP keepalives are enabled by default.
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
Some important notes about TCP keepalives:
Keepalive.TcpKeepAliveRetryCount
is only applicable to .NET Core; for .NET Framework, this value is forced to 10A special thanks to those that have helped improve the library thus far!
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
Need help or have feedback? Please file an issue here!
Please refer to CHANGELOG.md.
Special thanks to VektorPicker for the free Caveman icon: http://www.vectorpicker.com/caveman-icon_490587_47.html