سؤال

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

لقد كتبت تطبيق اختبار ، لكن لسبب ما لا يعمل:

#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>

@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end

@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
    printf("Haiz\n");
}
@end

int
main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSSocketPort *server = [NSSocketPort alloc];
    MyDelegate *foo = [MyDelegate alloc];
    [server initWithTCPPort: 1234];
    [server setDelegate: foo];
    [[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
    [[NSRunLoop mainRunLoop] run];
    [pool release];
    return 0;
}

من المفترض أن يستمع التطبيق على منفذ المضيف المحلي 1234 ، وكلما يتصل شخص ما بالخادم أو يرسل البيانات إلى الخادم ، من المفترض أن يقوم التطبيق بطباعة "Haiz" على وحدة التحكم. لكن التطبيق لا يفعل شيئًا على الإطلاق. يتم إنشاء المقبس ويمكنني telnet إلى المنفذ 1234 ، لكن التطبيق لا يطبع أي شيء إلى وحدة التحكم.

ما الخطأ الذي افعله؟

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

المحلول

من الوثائق:

يمكن استخدام كائن NSSocketPort كنقطة نهاية لاتصالات الكائن الموزعة.

هذا ليس ما تفعله هنا.

انت تريد أيضاً nsfilehandle حول واصف ملف المقبس من API BSD Sockets ، أو أ CFSocket. سيتيح لك ذلك وضع المقبس على حلقة التشغيل.

نصائح أخرى

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

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