"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل مع استقبال البيانات غير المكتملة في قراءات TCP غير المحظورة في Go؟

كيفية التعامل مع استقبال البيانات غير المكتملة في قراءات TCP غير المحظورة في Go؟

تم النشر بتاريخ 2024-11-08
تصفح:307

How to Handle Incomplete Data Reception in Go\'s Non-Blocking TCP Reads?

Go TCP Read غير محظورة: معالجة استقبال البيانات غير المكتملة

في Go، قراءات TCP غير محظورة، مما يعني أنها تعود على الفور مع أي بيانات متاحة، حتى لو كانت أقل من المتوقع. يختلف هذا السلوك عن عمليات القراءة المحظورة في لغة C، والتي تنتظر حتى يتم تلقي الكمية المطلوبة من البيانات.

سبب عدم حظر القراءة

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

حل للبيانات غير المكتملة

لقراءة عدد محدد من البايتات، استخدم io.ReadAtLeast أو io.ReadFull . بالنسبة للشروط التعسفية، قم بالتكرار على استدعاء القراءة حتى لا يكون هناك خطأ أو يتم استيفاء الشرط المحدد.

مثال:

package main

import (
    "fmt"
    "net"
    "time"
)

func main() {
    conn, _ := net.Dial("tcp", "127.0.0.1:4243")

    // Set a deadline to prevent hanging reads
    _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second))

    // Loop to read until a newline is encountered
    for {
        buf := make([]byte, 512)
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println(err)
            break
        }
        if n > 0 {
            str := string(buf[:n])
            if str[len(str)-1] == '\n' {
                fmt.Println(str)
                break
            }
        }
    }
}

اعتبارات أخرى

    التعامل مع إمكانية وجود حزم متعددة لكتابة واحدة.
  • استخدم المحددات أو طرق أخرى لتحديد حدود الرسالة .
  • فكر في استخدام net/textproto للبروتوكولات المستندة إلى النص.
  • تنفيذ المهلات أو المواعيد النهائية لمنع جوع الموارد.
  • مراجعة جميع الأخطاء من عمليات الشبكة لتجنب مشاكل الإخفاء.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3