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 connection
TCP キープアライブに関する重要な注意事項:
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