
CavemanTcp дает вам полный контроль над созданием приложений на основе TCP с участием клиентов и серверов.
С CavemanTcp у вас есть полный контроль над чтением и записью данных. CavemanTcp предназначен для тех, кому нужен явный контроль над чтением и записью данных, или для тех, кто хочет построить конечный автомат поверх TCP.
Важный:
Поскольку CavemanTcp полагается на приложение-потребитель, чтобы указать, когда читать или писать, нет фоновых потоков, постоянно отслеживающих состояние TCP-соединения (в отличие от SimpleTcp и WatsonTcp). Таким образом, вы должны создавать свои приложения с учетом того, что исключение может быть выдано в процессе чтения или записи.
Начиная с версии 1.3.0, поддержка активности TCP была добавлена для .NET Core и .NET Framework; к сожалению, .NET Standard не предлагает такую поддержку, поэтому она отсутствует для приложений, использующих CavemanTcp, ориентированных на .NET Standard.
Guid вместо string ipPortListClients теперь возвращает перечисление ClientMetadataSend и 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 или SslStreamNetworkStream или 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.