CavemanTcp는 클라이언트 및 서버와 관련된 TCP 기반 애플리케이션 구축에 대한 궁극적인 제어 기능을 제공합니다.
CavemanTcp를 사용하면 데이터 읽기 및 쓰기를 완벽하게 제어할 수 있습니다. CavemanTcp는 데이터를 읽거나 쓸 때 명시적인 제어를 원하거나 TCP 위에 상태 시스템을 구축하려는 사람들을 위해 설계되었습니다.
중요한:
CavemanTcp는 읽기 또는 쓰기 시기를 지정하기 위해 소비 애플리케이션에 의존하기 때문에 SimpleTcp 및 WatsonTcp와 달리 TCP 연결 상태를 지속적으로 모니터링하는 백그라운드 스레드가 없습니다. 따라서 읽기 또는 쓰기 도중에 예외가 발생할 수 있다는 예상을 바탕으로 앱을 빌드해야 합니다.
v1.3.0부터 .NET Core 및 .NET Framework에 대한 TCP 연결 유지 지원이 추가되었습니다. 안타깝게도 .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
이 10초 제한 시간으로 시작되어 50,000바이트를 읽으려고 시도했습니다.Status == ReadResultStatus.Timeout
인 ReadResult
반환되고 BytesRead
속성은 30,000으로 설정됩니다.NetworkStream
또는 SslStream
에서 대기 중인 서버에는 여전히 20,000바이트가 있습니다.v1.3.0부터는 주로 네트워크 인터페이스가 종료되거나 케이블이 분리되거나 미디어를 사용할 수 없게 되는 문제를 해결하기 위해 TCP keepalives에 대한 지원이 CavemanTcp에 추가되었습니다. Keepalive는 .NET Core 및 .NET Framework에서 지원되지만 .NET Standard에서는 지원되지 않는다는 점에 유의하는 것이 중요합니다. 이 릴리스부터 .NET Standard는 TCP 연결 유지 기능을 제공하지 않습니다.
TCP Keepalive는 기본적으로 활성화되어 있습니다.
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에 대한 몇 가지 중요한 참고 사항:
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