سؤال

يا شباب، لا أعرف إذا تم طرح هذا السؤال بعد ولكن تخيل الوضع التالي:

لدي اثنين من مقابس TCP (فتح مع NSSocketPort und الاستماع مع اثنين NSFileHandle) والآن أريد أن أرسل بعض NSData بينهم.

@try {
    [fileHandle writeData:data];
}
@catch (NSException * e) {
    // Do some alert
}

كل شيء على حق حتى أريد إرسال NSData مثيل مع أكثر من طول 32768 بايت. لن يتم نقل أكثر من هذا العدد من البايتات. إذا هذه هي اسئلتي:

1) لماذا لا قادرة الكاكاو على إرسال أكثر من 32768 بايت في وقت واحد؟
2) هل يجب علي صنع الحل البديل؟
3) إذا كانت الإجابة بنعم، سأقسم البيانات، ولكن كيف يمكنك أن تفعل ذلك؟ وكيف يعرف المقبس الآخر متى يتم إرسال جميع البيانات؟

بالمناسبة، بعد إرسال هذا واحد NSData يجب إغلاق مثيل كلا المقابس مرة أخرى.

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

المحلول

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

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

نصائح أخرى

مشكلتك ليست مع الكاكاو ولكن يبدو أن سوء فهم مفاهيمي من مآخذ التدفق.

TCP هو بروتوكول دفق. لن يتم الاحتفاظ حدود الكتب المنفصلة.

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

إذا أرسل WRITITATA أقل من البيانات التي أخبرتها بإرسالها، فاتصل بالكتاب مرة أخرى مع بقية البيانات. وكن مستعدا ل الذي - التي لإرسال أيضا أقل مما طلبت.

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