Хорошо. Вот и уже неделю пытаюсь подключить устройства p2p с потоками. Все еще безрезультатно, и я схожу с ума и в отчаянии. Пожалуйста, не присылайте меня к руководству Рэя Вендерлиха и вики GCD или к руководству CFStream, поскольку я дошел до дыр.
Итак 1) Вариант Здесь я
- Получить Ip моего устройства
- Вручную введите ip в текстовое поле другого устройства
- Начать сетевое соединение на одном устройстве.
Ошибка - подключение к хосту.
+ (NSString *)getIPAddress { NSString *address = @"error"; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; // retrieve the current interfaces - returns 0 on success success = getifaddrs(&interfaces); if (success == 0) { // Loop through linked list of interfaces temp_addr = interfaces; while(temp_addr != NULL) { if(temp_addr->ifa_addr->sa_family == AF_INET) { // Check if interface is en0 which is the wifi connection on the iPhone if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) { // Get NSString from C String address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; } } temp_addr = temp_addr->ifa_next; } } // Free memory freeifaddrs(interfaces); return address; }
- (void) initNetworkCommunication:(NSString*)ipToConnect { NSString *urlStr = ipToConnect; if (![urlStr isEqualToString:@""]) { NSURL *website = [NSURL URLWithString:urlStr]; if (!website) { NSLog(@"%@ is not a valid URL"); return; } CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)[website host], 80, &readStream, &writeStream);
NSInputStream * inputStream = (__bridge_transfer NSInputStream *) readStream; NSOutputStream * outputStream = (__bridge_transfer NSOutputStream *) writeStream; [inputStream setDelegate: я]; [outputStream setDelegate: сам]; [inputStream scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [outputStream scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [inputStream open]; [outputStream open];
}
- (void) stream: (NSStream *) theStream handleEvent: (NSStreamEvent) streamEvent {
NSLog (@ "событие потока% lu", streamEvent);
switch (streamEvent) {
case NSStreamEventOpenCompleted: NSLog(@"Stream opened"); break; case NSStreamEventHasBytesAvailable: if (theStream == inputStream) { uint8_t buffer[1024]; int len; while ([inputStream hasBytesAvailable]) { len = [inputStream read:buffer maxLength:sizeof(buffer)]; if (len > 0) { NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; if (nil != output) { NSLog(@"server said: %@", output); //[self messageReceived:output]; } } } } break; case NSStreamEventErrorOccurred: NSLog(@"Can not connect to the host!"); break; case NSStreamEventEndEncountered: [theStream close]; [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; // [theStream release]; theStream = nil; break; default: NSLog(@"Unknown event");
}
}
Вариант 2 с НОД. 1. То же 2. Настройте оба устройства на прослушивание ввода.
+(void)listenSocket:(GCDAsyncSocket*)listenSocket
{
listenSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
if (![listenSocket acceptOnPort:80 error:&error])
{
NSLog(@"I goofed: %@", error);
}
}
3) Пытался подключиться с ручным вводом IP
+(void)connectToDeviceWithIp:(NSString*)deviceIp andSend:(HSUserCard*)tempCard andSocket:(GCDAsyncSocket*)tempSocket
{
tempSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err = nil;
if (![tempSocket connectToHost:deviceIp onPort:80 error:&err])
NSLog(@"I goofed: %@", err);
[tempSocket writeData:[NSKeyedArchiver archivedDataWithRootObject:tempCard] withTimeout:-1 tag:1];
}
4) Ничего не дало результата - я сделал несколько перерывов для каждой функции-делегата = НИЧЕГО.
Омг - я решил эту задачу на Android за 20 минут! Но здесь это просто сводит с ума. Пробовал в нескольких сетях. Через 3G, домашний wifi. Пожалуйста, помогите кому-нибудь!