كيفية التعامل مع بيانات التخزين المؤقت القراءة من الشبكة؟

StackOverflow https://stackoverflow.com/questions/1403986

سؤال

عند قراءة البيانات عبر الشبكة، يمكنك تحديد منطقة عازلة لاستقبال البيانات إلى:

byte[] b = new byte[4096];
socket.Receive(b);

والآن فكرتي الأولى هي بالطبع لإعادة المخزن المؤقت تلقي بإعلان أنها متغير عضو من الطبقة. بلدي العدد القادم هو أنني لم أتلق جميع البيانات التي أتوقع، لذلك أنا بحاجة إلى العازلة البيانات الخاصة بي. هذا من السهل أن يحققه من خلال تتبع عدد وحدات البايت وردت، وتحديد الإزاحة:

socket.Receive(m_ReceiveBuffer, count, m_ReceiveBuffer.Length - count);

والآن، فإن المسألة هنا هي أنه إذا كان لا يزال لا يكفي، وأنا على التخمين أنني بحاجة لزراعة العازلة، مما يعني نسخ الذاكرة، وتستمر في تلقي إلى هذا المخزن المؤقت. على افتراض أن ما حدث من خطأ، فإن هذا المخزن المؤقت تستمر في النمو، وإذا وردت رسائل كبيرة بما يكفي، سيتم تشغيل النظام من الذاكرة.

وأي أفكار كيفية التعامل مع هذا صحيح؟ هل هناك طريقة أفضل من تلقي البيانات من ملء فقط، نسخة، وتنمو، وملء، نسخة، وتنمو أن أتحدث عنه؟

هل كانت مفيدة؟

المحلول

وقراءة في قطع:

const int ChunkSize = 4096;
int bytesRead;
byte[] buffer = new byte[ChunkSize];
while ((bytesRead = socket.Receive(buffer, 0, ChunkSize, SocketFlags.None)) > 0)
{
    byte[] actualBytesRead = new byte[bytesRead];
    Buffer.BlockCopy(buffer, 0, actualBytesRead, 0, bytesRead);
    // Do something with actualBytesRead, 
    // maybe add it to a list or write it to a stream somewhere
}

نصائح أخرى

وقبل البدء مع SYstem.Net.Sockets.Socket، هل أنت متأكد أنه لا يمكنك استخدام System.Net.Sockets.TcpClient (أو UdpClient) أن يفعل كل عمل عازلة الفوضى بالنسبة لك، ويتحول ذلك إلى إدارتها بسهولة تيار؟

إذا لم يكن كذلك، تذكر أن كمية البيانات التي تلقي ليس من الضروري أن يكون مساويا لما تطلب، لذلك يجب أن ننظر دائما في قيمة العائد من وظيفة تلقي. والطريقة الوحيدة للا ينفد من الذاكرة عن طريق معالجة الواقع ما تحصل.

أولا، فصل رمز إلى تلقي البيانات ومعالجة البيانات. المخزن المؤقت تلقي ينبغي أن تعقد البيانات فقط حتى يحصل على كود فرصة لنسخه إلى المنطقة المعالجة. المنطقة المعالجة هو المكان الذي سيحدد إذا كنت قد تلقيت بيانات كافية لتفعل شيئا مفيدا. لا تترك البيانات في الشبكة تتلقى عازلة حتى يحدث هذا. لشبكة تلقي العازلة، وأعتقد أن استخدام منطقة عازلة دائري سوف تساعدك مع فكرتك من إعادة استخدام منطقة عازلة. نأمل، لديك فكرة عن أحجام الرسالة. سوف تساعد في تحديد حجم المخزن المؤقت. إذا كنت تأكيد (أو ما شابه) عند القراءة والكتابة مؤشرات لقاء عازلة دائرية، ثم زيادة حجم المخزن المؤقت. وبمجرد أن حجم المخزن المؤقت كبيرة بما فيه الكفاية، يجب أن تكون قادرا على قراءة بيانات كافية من المخزن المؤقت إلى رمز المعالجة بمعدل سريع بما فيه الكفاية أن المخزن المؤقت دائري لا تجاوز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top