
CavemanTcp を使用すると、クライアントとサーバーが関与する TCP ベースのアプリケーションを構築する際の究極の制御が可能になります。
CavemanTcp を使用すると、データの読み取りと書き込みを完全に制御できます。 CavemanTcp は、データの読み取りまたは書き込みを明示的に制御したい場合や、TCP 上にステート マシンを構築したい場合に向けて設計されています。
重要:
CavemanTcp は、いつ読み取りまたは書き込みを行うかを指定するために使用側アプリケーションに依存しているため、(SimpleTcp や WatsonTcp とは異なり) TCP 接続の状態を継続的に監視するバックグラウンド スレッドはありません。したがって、読み取りまたは書き込みの途中で例外がスローされる可能性があることを想定してアプリを構築する必要があります。
v1.3.0 の時点で、TCP キープアライブ サポートが .NET Core および .NET Framework に追加されました。残念ながら、.NET Standard はこのサポートを提供していないため、.NET Standard を対象とした CavemanTcp を使用するアプリにはサポートされていません。
string ipPortではなくGuidによって参照されるようになりましたListClients ClientMetadataの列挙を返すようになりましたstring ipPort使用するSendとReadメソッドは廃止のマークが付けられています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指定すると、ローカル ホスト内からの接続のみを受け入れることができます。null 、 * 、 + 、または0.0.0.0を使用します (任意の IP アドレスをリッスンするには管理者権限が必要です)。タイムアウトを指定できる API (つまり、 SendWithTimeout 、 SendWithTimeoutAsync 、 ReadWithTimeout 、およびReadWithTimeoutAsync ) を使用する場合、結果として得られる上記のWriteResultおよびReadResult 、操作がタイムアウトしたかどうかを示します。
タイムアウトが何を示しているかを理解することが重要であり、タイムアウトが何を示していないのかを理解することがさらに重要です。
NetworkStreamまたはSslStreamにデータを書き込むことができたかどうかが重要です。NetworkStreamまたはSslStreamから指定されたバイト数を読み取ることができない場合、読み取り操作でタイムアウトが発生します。timeoutMsの有効な値は、 -1または任意の正の整数です。 -1タイムアウトがないことを示し、タイムアウトを指定しない API を使用するのと同じです。BytesReadまたはBytesWritten (読み取りまたは書き込みの場合) に細心の注意を払ってください。タイムアウトは操作中に発生した可能性があるため、障害から回復することが重要です。ReadWithTimeoutが開始され、50,000 バイトの読み取りが試行されました。Status == ReadResultStatus.TimeoutのReadResultが返され、 BytesReadプロパティは 30,000 に設定されます。NetworkStreamまたはSslStreamで待機しているサーバーからの 20,000 バイトがまだ残っています。v1.3.0 以降、TCP キープアライブのサポートが CavemanTcp に追加されました。これは主に、ネットワーク インターフェイスのシャットダウン、ケーブルの抜き差し、またはメディアが使用できなくなる問題に対処するためです。キープアライブは .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 connectionTCP キープアライブに関する重要な注意事項:
Keepalive.TcpKeepAliveRetryCountは .NET Core にのみ適用されます。 .NET Framework の場合、この値は強制的に 10 になります。 これまでライブラリの改善にご協力いただいた方々に心より感謝いたします。
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
サポートが必要ですか、それともフィードバックがありますか?ここに問題を提出してください。
CHANGELOG.mdを参照してください。
無料の Caveman アイコンを提供してくれた VektorPicker に感謝します: http://www.vectorpicker.com/caveman-icon_490587_47.html