Mam pewną logikę, która działa przez utworzenie gniazda domeny uniksowej i nie ma żadnych problemów podczas uruchamiania w normalnej aplikacji. Jednak gdy uruchomię to dla rozszerzenia aplikacji, otrzymam -1 z errno = 48 ("Adres już w użyciu") z bind().Wiązanie gniazda domeny uniksowej w rozszerzeniu iOS kończy się niepowodzeniem z errno 48 (Adres już w użyciu)
NSArray *applicationSupportDirectoryPaths =
NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES);
int fd = socket(AF_UNIX, SOCK_STREAM, 0); // returns a non-zero value
NSString *loc = [applicationSupportDirectoryPaths[0] stringByAppendingPathComponent:@"usd"];
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX ;
strncpy(addr.sun_path, [loc UTF8String], sizeof(addr.sun_path)-1);
int bindres = bind(fd, (struct sockaddr*)&addr, sizeof(addr)); // returns -1, error is 48
Lokalizacja wrócił do katalogu biblioteki jest:
/var/mobile/Containers/Data/PluginKitPlugin/A8110BA2-5AE7-42C1-84DA-2A9B303C7277/Library/
Myślę, że powodem jest to zawodzi, ponieważ jest to jakiś specjalny położenie w stosunku do katalogu biblioteki dla aplikacji.
Jeśli ktoś ma jakieś pomysły, dlaczego tak się dzieje lub jakikolwiek sposób obejścia problemu, doceniam to.
AKTUALIZACJA: Próbowałem z katalogu pamięci podręcznych (NSCachesDirectory), ale teraz otrzymuję errno 3 (brak takiego procesu).
Najpierw myślę, że adres jest naprawdę w użyciu. iOS może inicjować/zabijać rozszerzenia na żądanie, więc gniazdo powiązane w poprzednim połączeniu może nie zostać zwolnione podczas następnego połączenia. Dlaczego potrzebny jest program nasłuchujący gniazda domeny w kodzie rozszerzenia? –
Wygląda na to, że masz rację. Początkowo myślałem, że to nie problem, ale w moim kodzie pojawił się drugi problem maskujący prawdziwy problem. Myślę, że teraz to zrozumiałem. – Locksleyu
Chcę dać (Alex Skalozub) reputację +50, ale nie jestem pewien jak. Może powinieneś opublikować pełną odpowiedź z tym samym komentarzem co Twój komentarz? Lub możemy pozwolić, aby administrator sobie z tym poradził. – Locksleyu