
يمنحك 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 ipPortListClients الآن بإرجاع تعداد ClientMetadataSend 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