CavemanTcp memberi Anda kendali penuh dalam membangun aplikasi berbasis TCP yang melibatkan klien dan server.
Dengan CavemanTcp, Anda memiliki kendali penuh atas membaca dan menulis data. CavemanTcp dirancang bagi mereka yang menginginkan kontrol eksplisit atas kapan data dibaca atau ditulis atau ingin membangun mesin status di atas TCP.
Penting:
Karena CavemanTcp bergantung pada aplikasi yang digunakan untuk menentukan kapan harus membaca atau menulis, tidak ada thread latar belakang yang terus memantau status koneksi TCP (tidak seperti SimpleTcp dan WatsonTcp). Oleh karena itu, Anda harus membangun aplikasi dengan harapan bahwa pengecualian dapat terjadi saat sedang membaca atau menulis.
Pada v1.3.0, dukungan TCP keepalive telah ditambahkan untuk .NET Core dan .NET Framework; sayangnya .NET Standard tidak menawarkan dukungan ini, sehingga tidak tersedia untuk aplikasi yang menggunakan CavemanTcp yang ditargetkan ke .NET Standard.
Guid
, bukan string ipPort
ListClients
sekarang mengembalikan enumerasi ClientMetadata
Send
dan Read
yang menggunakan string ipPort
ditandai sebagai usangAddClient
semakin mendekati penerimaan koneksinet461
net472
net48
net6.0
net7.0
dan 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
dan ReadResult
berisi properti Status
yang menunjukkan salah satu hal berikut:
ClientNotFound
- hanya berlaku untuk operasi baca dan tulis serverSuccess
– operasi berhasilTimeout
- waktu operasi habis (dicadangkan untuk penggunaan di masa mendatang)Disconnected
- rekan terputus WriteResult
juga mencakup:
BytesWritten
- jumlah byte yang ditulis ke soket. ReadResult
juga mencakup:
BytesRead
- jumlah byte yang dibaca dari soket.DataStream
- MemoryStream
berisi data yang diminta.Data
- representasi byte[]
dari DataStream
. Menggunakan properti ini akan membaca DataStream
sepenuhnya sampai akhir. PENTING
127.0.0.1
sebagai alamat IP pendengar, ia hanya dapat menerima koneksi dari dalam host lokal.null
, *
, +
, atau 0.0.0.0
untuk alamat IP pendengar (memerlukan hak istimewa admin untuk mendengarkan pada alamat IP mana pun) Saat menggunakan salah satu API yang memungkinkan Anda menentukan batas waktu (yaitu SendWithTimeout
, SendWithTimeoutAsync
, ReadWithTimeout
, dan ReadWithTimeoutAsync
), hasil WriteResult
dan ReadResult
seperti yang disebutkan di atas akan menunjukkan apakah waktu operasi telah habis.
Penting untuk memahami apa yang ditunjukkan oleh batas waktu dan lebih penting lagi apa yang tidak ditunjukkan oleh batas waktu tersebut.
NetworkStream
atau SslStream
yang mendasarinyaNetworkStream
atau SslStream
yang mendasarinya dalam jumlah milidetik yang ditentukantimeoutMs
adalah -1
atau bilangan bulat positif apa pun. -1
menunjukkan tidak ada batas waktu dan sama dengan menggunakan API yang tidak menentukan batas waktuBytesRead
atau BytesWritten
(jika Anda membaca atau menulis) jika ada waktu habis. Batas waktu mungkin terjadi di tengah pengoperasian dan oleh karena itu penting untuk memulihkan kegagalan.ReadWithTimeout
dimulai dengan batas waktu 10 detik, mencoba membaca 50.000 byteReadResult
dengan Status == ReadResultStatus.Timeout
dikembalikan, dan properti BytesRead
diatur ke 30.000NetworkStream
atau SslStream
yang mendasari klienPada v1.3.0, dukungan untuk TCP keepalives telah ditambahkan ke CavemanTcp, terutama untuk mengatasi masalah antarmuka jaringan dimatikan, kabel dicabut, atau media menjadi tidak tersedia. Penting untuk dicatat bahwa keepalives didukung di .NET Core dan .NET Framework, tetapi BUKAN .NET Standard. Pada rilis ini, .NET Standard tidak menyediakan fasilitas untuk TCP keepalives.
Keepalives TCP diaktifkan secara 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
Beberapa catatan penting tentang TCP keepalives:
Keepalive.TcpKeepAliveRetryCount
hanya berlaku untuk .NET Core; untuk .NET Framework, nilai ini dipaksa menjadi 10 Terima kasih khusus kepada mereka yang telah membantu meningkatkan perpustakaan sejauh ini!
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
Butuh bantuan atau punya masukan? Silakan ajukan masalah di sini!
Silakan merujuk ke CHANGELOG.md.
Terima kasih khusus kepada VektorPicker untuk ikon Manusia Gua gratis: http://www.vectorpicker.com/caveman-icon_490587_47.html