2016-04-02 12 views
1

2016 yılı itibarı ile Apple docs eski ve çalışmıyor. Örneğin, "sakla" dır, fakat XCode 7.1'de varsayılan ayar ARC'yi kullanmaktır ve "koruma" özelliğini desteklemez. İnternette çeşitli örnekler denedim ve hiç işe yaramadı. Bir istemci uygulamasının bir sunucu uygulamasında sınıf yöntemlerini (özellikle bir LaunchDaemon'da oluşturulmuş, ama gerektirmeyen gibi) çağırabileceği OSX'te Dağıtılmış Nesneler adlı IPC mekanizmasını nasıl kodlarım?Amaç C ile OSX'te Dağıtılmış Nesneler Nasıl Yapılır?

cevap

3

Gitmenizi sağlayan bir kod örneği. Server.mm projesi muhtemelen en iyi şekilde LaunchDaemon'a yükler. Ben root kullanıcısı olarak çalışan daemon ile bazı testler yaptım ve "mike" olarak çalışan istemci uygulaması, "root" olarak daemonda kod çalıştı. Böylece, ayrıcalık yükselmesini sağlar. Bu IPC'nin herhangi bir protokol şifrelemesi veya kimlik doğrulama sorunu sunmadığını unutmayın, bu yüzden bunu kendiniz eklemeniz yeterlidir. AES256 + Base64 kodlaması ile şifrelenmiş bir anahtar/liste, XML veya JSON mesajıyla, hem gönderme hem de alma konusunda uzun, zor bir şifre deyimiyle büyük olasılıkla uzaklaşabilirsiniz. Unutmayın, ayrıcalık yükselmesiyle, bazı koruma mekanizmalarını yerleştirmeniz çok önemlidir.

Sunucuyu önce başlatın ve orada oturup bağlantılarda bekler. Bir sonraki müşteriyi başlatın ve bir bağlantı kuracak, bir örnek sınıf yöntemine veri aktaracak, bir mesaj bekleyip geri alacak, sonra görüntüleyip kapatacak. Sunucu ayrıca bir geri bildirim gönderilmeden önce bağlantının yapıldığını ve sunucuda ne alındığını da gösterecektir.

Bunun eşzamanlı bir örnek olduğunu, yani sınıf yöntemini çağırdığınızı ve yanıt beklediğini unutmayın. Eşzamansız olmasını istiyorsanız, oneway keyword'daki Apple belgelerini okumalısınız. Sınıf yöntem beyanında istemciye ve sunucuya koydu. Sadece oneway anahtar kelimesinin, yalnızca bir asenkron sınıf yöntemine yanıt alamadığınız için geçersiz bir şekilde döndüren bir sınıf yöntemiyle kullanıldığını unutmayın. Bu nedenle, bir görevi başlatmak için bir async çağrısı yaparsınız ve daha sonra başlattığınız görevde durum güncellemesi almak için senkronize bir çağrı kullanırsınız. Yani, burada oneway anahtar kelime olurdu bir sınıf yöntemi tanımlaması örneği var ekledi:

- (oneway void)runTaskAsync:(NSString *)sParam; 

Ve şimdi, kod ...

server.m

#import <Foundation/Foundation.h> 

#define cat stringByAppendingString 

@interface MyService : NSObject { 
    NSConnection *connection; 
} 
@end 

@implementation MyService 

- (NSString *)testResponse:(NSString *)s { 
    NSLog(@"...connection:%@", s); 
    s = [s cat:@"-response"]; 
    return s; 
} 

- (void)runService { 
    connection = [[NSConnection alloc] init]; 
    [connection setRootObject:self]; 
    [connection registerName:@"com.acme.myservice"]; 
    [[NSRunLoop currentRunLoop] run]; 
} 

@end 

int main (int argc, const char *argv[]) { 
    @autoreleasepool { 
     NSLog(@"ACME MyService 1.0\n"); 
     MyService *svc = [[MyService alloc] init]; 
     [svc runService]; 
    } 
    return 0; 
} 

client.m

#import <Foundation/Foundation.h> 

int main (int argc, const char *argv[]) { 
    @autoreleasepool { 
     NSLog(@"building proxy object"); 
     id proxy = [NSConnection rootProxyForConnectionWithRegisteredName:@"com.acme.myservice" host:nil]; 
     NSLog(@"calling test response thru proxy object"); 
     NSString *sResult = [proxy testResponse:@"sent"]; 
     NSLog(@"RESULT=%@", sResult); 
    } 
    return 0; 
} 
+0

Bu, C++'ın herhangi bir özelliğini kullanmadığını söyleyebileceğim kadarıyla Objective-C++ olması gerekmez. – tbodt