كيفية العثور على المنفذ المناسب لـ NSNetService على نظام iOS؟

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

سؤال

أقوم بإنشاء تطبيق مكون من مكونين، مكون iPhone ومكون Mac.من المفترض أن يتواصلوا مع بعضهم البعض عبر صباح الخير.أستخدم الكود التالي على جهاز Mac للعثور على منفذ للخدمة:

NSSocketPort *socket = [[NSSocketPort alloc] init];
struct sockaddr *addr = (struct sockaddr *)[[socket address] bytes];
int port = 9876;
if(addr->sa_family == AF_INET) {
    port = ntohs(((struct sockaddr_in *)addr)->sin_port);
} else if(addr->sa_family == AF_INET6) {
    port = ntohs(((struct sockaddr_in6 *)addr)->sin6_port);
} else {
    [socket release];
    socket = nil;
    NSLog(@"The family is neither IPv4 nor IPv6. Can't handle!!!");
}

يمكنني أيضًا استخدام هذا الرمز على جهاز iPhone وتشغيل التطبيق في جهاز المحاكاة، ويعمل الاتصال بشكل جيد.ومع ذلك، عندما حاولت تشغيل هذا الرمز على جهاز iPhone فعلي، اكتشفت أن NSSocketPort غير متوفر على جهاز iPhone.عندما أحاول تشغيل الخدمة باستخدام المنفذ 9876، يعرض تطبيق Mac خطأ رفض الاتصال عندما أحاول الاتصال به.إذًا كيف يمكنني العثور على منفذ لاستخدامه دون استخدام NSSocketPort؟

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

المحلول

حسنا، نظرت إلى رمز WITAP في Apple وتعديلها قليلا لكتابة نفسي طريقة للحصول على منفذ:

giveacodicetagpre.

أخرجت الكثير من الأشياء الخطأ حتى لا يكون الأمر مثاليا، لكنه يعمل.

نصائح أخرى

اعتبارًا من نظام التشغيل iOS 7، يمكن لـ NSNetService إنشاء المقبس وربطه نيابةً عنك.إذا تم التهيئة باستخدام المنفذ صفر، فسيتم اختيار منفذ عشوائي:

NSNetService *service = [[NSNetService alloc] initWithDomain:@"local." type:@"_test._tcp." name:@"Test Service" port:0];
[service publishWithOptions:NSNetServiceListenForConnections];

سيتم إرسال الخدمة netService:didAcceptConnectionWithInputStream:outputStream: إلى مندوبه عند إنشاء الاتصال.

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