CavemanTcp дает вам полный контроль над созданием приложений на основе TCP с участием клиентов и серверов.
С CavemanTcp у вас есть полный контроль над чтением и записью данных. CavemanTcp предназначен для тех, кому нужен явный контроль над чтением и записью данных, или для тех, кто хочет построить конечный автомат поверх TCP.
Важный:
Поскольку CavemanTcp полагается на приложение-потребитель, чтобы указать, когда читать или писать, нет фоновых потоков, постоянно отслеживающих состояние TCP-соединения (в отличие от SimpleTcp и WatsonTcp). Таким образом, вы должны создавать свои приложения с учетом того, что исключение может быть выдано в процессе чтения или записи.
Начиная с версии 1.3.0, поддержка активности TCP была добавлена для .NET Core и .NET Framework; к сожалению, .NET Standard не предлагает такую поддержку, поэтому она отсутствует для приложений, использующих CavemanTcp, ориентированных на .NET Standard.
Guid
вместо string ipPort
ListClients
теперь возвращает перечисление ClientMetadata
Send
и Read
с использованием string ipPort
помечены как устаревшие.AddClient
приблизился к принятию соединенияnet461
net472
net48
net6.0
net7.0
и 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
и ReadResult
содержат свойство Status
, которое указывает одно из следующего:
ClientNotFound
— применимо только для операций чтения и записи сервера.Success
– операция прошла успешноTimeout
- тайм-аут операции (зарезервировано для будущего использования)Disconnected
– партнер отключен WriteResult
также включает в себя:
BytesWritten
— количество байт, записанных в сокет. ReadResult
также включает в себя:
BytesRead
— количество байт, прочитанных из сокета.DataStream
— MemoryStream
содержащий запрошенные данные.Data
— представление DataStream
в byte[]
. Использование этого свойства позволит полностью прочитать DataStream
до конца. ВАЖНЫЙ
127.0.0.1
в качестве IP-адреса прослушивателя, он сможет принимать соединения только с локального хоста.null
, *
, +
или 0.0.0.0
в качестве IP-адреса прослушивателя (для прослушивания любого IP-адреса требуются права администратора). При использовании любого из API, которые позволяют указать тайм-аут (т. е. SendWithTimeout
, SendWithTimeoutAsync
, ReadWithTimeout
и ReadWithTimeoutAsync
), результирующие WriteResult
и ReadResult
, как упоминалось выше, будут указывать, истекло ли время ожидания операции.
Важно понимать, на что указывает тайм-аут, и, что более важно, на что он не указывает.
NetworkStream
или SslStream
NetworkStream
или SslStream
за отведенное количество миллисекунд.timeoutMs
: -1
или любое положительное целое число. -1
указывает на отсутствие тайм-аута и аналогично использованию API, в котором тайм-аут не указан.BytesRead
или BytesWritten
(если вы читали или записывали) в случае тайм-аута. Тайм-аут мог произойти в середине операции, поэтому важно восстановиться после сбоя.ReadWithTimeout
с тайм-аутом 10 секунд при попытке прочитать 50 000 байт.ReadResult
со Status == ReadResultStatus.Timeout
, а для свойства BytesRead
установлено значение 30 000.NetworkStream
или SslStream
клиента.Начиная с версии 1.3.0, в CavemanTcp была добавлена поддержка TCP-сообщений, в первую очередь для решения проблемы отключения сетевого интерфейса, отключения кабеля или недоступности носителя по другим причинам. Важно отметить, что проверки активности поддерживаются в .NET Core и .NET Framework, но НЕ .NET Standard. Начиная с этого выпуска, .NET Standard не предоставляет средств для поддержки активности TCP.
Поддержка активности TCP включена по умолчанию.
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
Несколько важных замечаний по поводу поддержки активности TCP:
Keepalive.TcpKeepAliveRetryCount
применим только к .NET Core; для .NET Framework это значение принудительно равно 10 Особая благодарность тем, кто до сих пор помогал улучшить библиотеку!
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
Нужна помощь или хотите оставить отзыв? Пожалуйста, сообщите о проблеме здесь!
Пожалуйста, обратитесь к CHANGELOG.md.
Особая благодарность VektorPicker за бесплатную иконку Пещерного человека: http://www.vectorpicker.com/caveman-icon_490587_47.html.