CavemanTcp ให้การควบคุมขั้นสูงสุดแก่คุณในการสร้างแอปพลิเคชันบน TCP ที่เกี่ยวข้องกับไคลเอนต์และเซิร์ฟเวอร์
ด้วย CavemanTcp คุณสามารถควบคุมการอ่านและเขียนข้อมูลได้เต็มรูปแบบ CavemanTcp ได้รับการออกแบบมาสำหรับผู้ที่ต้องการควบคุมอย่างชัดเจนว่าจะอ่านหรือเขียนข้อมูลเมื่อใด หรือต้องการสร้างเครื่องสถานะบน TCP
สำคัญ:
เนื่องจาก CavemanTcp อาศัยแอปพลิเคชันที่ใช้งานหนักเพื่อระบุเวลาที่จะอ่านหรือเขียน จึงไม่มีเธรดพื้นหลังคอยตรวจสอบสถานะของการเชื่อมต่อ TCP อย่างต่อเนื่อง (ต่างจาก SimpleTcp และ WatsonTcp) ดังนั้น คุณควรสร้างแอปของคุณโดยคาดหวังว่าอาจมีข้อยกเว้นเกิดขึ้นในขณะที่อยู่ระหว่างการอ่านหรือเขียน
ตั้งแต่เวอร์ชัน 1.3.0 มีการเพิ่มการสนับสนุน TCP Keepalive สำหรับ .NET Core และ .NET Framework น่าเสียดายที่ .NET Standard ไม่ให้การสนับสนุนนี้ ดังนั้นจึงไม่มีสำหรับแอปที่ใช้ CavemanTcp ที่กำหนดเป้าหมายเป็น .NET Standard
Guid
แทนที่จะเป็น string ipPort
ListClients
ส่งคืนการแจงนับของ ClientMetadata
Send
และ 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
- การแสดง byte[]
ของ DataStream
การใช้คุณสมบัตินี้จะอ่าน DataStream
จนจบ สำคัญ
127.0.0.1
เป็นที่อยู่ IP ของผู้ฟัง จะสามารถรับการเชื่อมต่อจากภายในโฮสต์ภายในเครื่องเท่านั้นnull
, *
, +
หรือ 0.0.0.0
สำหรับที่อยู่ IP ของผู้ฟัง (ต้องมีสิทธิ์ของผู้ดูแลระบบจึงจะฟังที่อยู่ IP ใดก็ได้) เมื่อใช้ API ใดๆ ที่อนุญาตให้คุณระบุการหมดเวลา (เช่น SendWithTimeout
, SendWithTimeoutAsync
, ReadWithTimeout
และ ReadWithTimeoutAsync
) ผลลัพธ์ WriteResult
และ ReadResult
ที่ได้กล่าวไว้ข้างต้นจะระบุว่าการดำเนินการหมดเวลาหรือไม่
สิ่งสำคัญคือต้องเข้าใจว่าการหมดเวลาบ่งบอกถึงอะไร และที่สำคัญกว่านั้นคือสิ่งที่ไม่บ่งชี้
NetworkStream
หรือ SslStream
ได้หรือไม่NetworkStream
หรือ SslStream
พื้นฐานในจำนวนมิลลิวินาทีที่กำหนดไว้timeoutMs
คือ -1
หรือจำนวนเต็มบวกใดๆ -1
ระบุว่าไม่มีการหมดเวลา และเหมือนกับการใช้ API ที่ไม่ได้ระบุการหมดเวลาBytesRead
หรือ BytesWritten
(หากคุณกำลังอ่านหรือเขียน) ในกรณีที่หมดเวลา การหมดเวลาอาจเกิดขึ้นระหว่างการดำเนินการ และดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องฟื้นฟูจากความล้มเหลวReadWithTimeout
เริ่มต้นด้วยการหมดเวลา 10 วินาที โดยพยายามอ่าน 50,000 ไบต์ReadResult
พร้อม Status == ReadResultStatus.Timeout
จะถูกส่งกลับ และคุณสมบัติ BytesRead
ถูกตั้งค่าเป็น 30,000NetworkStream
หรือ SslStream
พื้นฐานของไคลเอนต์ตั้งแต่เวอร์ชัน 1.3.0 เป็นต้นไป มีการเพิ่มการรองรับ TCP Keepalive ให้กับ CavemanTcp โดยมีวัตถุประสงค์หลักเพื่อแก้ไขปัญหาอินเทอร์เฟซเครือข่ายถูกปิด การถอดสายเคเบิลออก หรือสื่อไม่พร้อมใช้งาน สิ่งสำคัญคือต้องทราบว่า Keepalive ได้รับการสนับสนุนใน .NET Core และ .NET Framework แต่ไม่ใช่ .NET Standard ในเวอร์ชันนี้ .NET Standard ไม่มีสิ่งอำนวยความสะดวกสำหรับ TCP Keepalive
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
ขอขอบคุณเป็นพิเศษสำหรับ VektorPicker สำหรับไอคอน Caveman ฟรี: http://www.vectorpicker.com/caveman-icon_490587_47.html