يمنحك 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) عند استخدام أي من واجهات برمجة التطبيقات التي تسمح لك بتحديد المهلة (مثل SendWithTimeout
و SendWithTimeoutAsync
و ReadWithTimeout
و ReadWithTimeoutAsync
)، فإن نتيجة WriteResult
و ReadResult
كما هو مذكور أعلاه ستشير إلى ما إذا كانت العملية قد انتهت أم لا.
من المهم أن نفهم ما تشير إليه المهلة، والأهم من ذلك ما لا تشير إليه.
NetworkStream
أو SslStream
الأساسي أم لاNetworkStream
أو SslStream
الأساسي في العدد المخصص بالمللي ثانيةtimeoutMs
هي -1
أو أي عدد صحيح موجب. -1
يشير إلى عدم وجود مهلة وهو نفس استخدام واجهة برمجة التطبيقات التي لا تحدد مهلةBytesRead
أو BytesWritten
(إذا كنت تقرأ أو تكتب) في حالة انتهاء المهلة. قد تكون المهلة قد حدثت في منتصف العملية، وبالتالي سيكون من المهم التعافي من الفشل.ReadWithTimeout
مع مهلة 10 ثوانٍ، لمحاولة قراءة 50000 بايتReadResult
مع Status == ReadResultStatus.Timeout
، ويتم تعيين خاصية BytesRead
على 30,000NetworkStream
أو SslStream
الأساسي للعميلاعتبارًا من الإصدار 1.3.0، تمت إضافة دعم TCP keepalives إلى 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.
شكر خاص لـ VektorPicker على أيقونة رجل الكهف المجانية: http://www.vectorpicker.com/caveman-icon_490587_47.html