当前位置: 首页 > 知识库问答 >
问题:

创建p2p连接iOS

杜嘉慕
2023-03-14

好的。所以我已经尝试将设备p2p与流连接了一周。仍然没有结果,我变得疯狂和绝望。请不要将我发送到Ray Wendderlich教程和GCD wiki或CFStream Guide,因为我已经将其冲浪到洞。

So 1)这里的变体i

>

  • 获取我的设备的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*网站=[NSURL URLWithString:urlStr];if(!website){NSLog(@“%@不是有效的URL”);return;}CFReadStreamRef readStream;CFWriteStreamRef writeStream;CFStreamCreatePairWithSocketToHost(NULL,(_ubridge CFStringRef)[网站主机],80,

    NSInputStream*inputStream=(__bridge_transferNSInputStream*)readStream; NSOutputStream*outputStream=(__bridge_transferNSOutputStream*)WriteStream;[inputStream setServer ate: self];[outputStream setServer ate: self];[inputStream计划InRunLoop:[NSRunLoop电流循环]forMode: NSDefaultRunLoopMode];[outputStream计划InRunLoop:[NSRunLoop电流循环]forMode: NSDefaultRunLoopMode];[inputStream open];[outputStream open];

    }

    • (void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent{

    NSLog(@“流事件%lu”,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");
    

    }

    }

    带有GCD的变体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。请有人帮忙!

  • 共有1个答案

    左丘智渊
    2023-03-14

    我从您的各种尝试中看到的问题是,您正在将套接字存储在局部变量中-这意味着一旦方法退出,它将被释放,并且该套接字上不可能进行通信。

    您需要将套接字引用存储在属性中。

    我使用CocoaAsyncSocket创建了一个示例应用程序,该应用程序演示了侦听连接和建立连接,以及通过保存套接字的属性跟踪连接状态。

    这里有https://github.com/paulw11/SocketDemo

     类似资料:
    • 为了和Azure IoT设备通信,在创建设备之后会获得设备连接字符串,我们需要用这个字符串创建一个连接凭据。 请求方式: "|4|2|1|connectionString|" 参数 connectionString 设备连接字符串 返回值: "|4|2|1|1|\r" 创建成功 "|4|2|1|2|reason|\r" 创建失败 参数 reason 创建失败的原因 Arduino样例: softS

    • 我有这个使用HikariCP连接池的代码: 我通过发出命令“Show Processlist”来监控mysql中的连接,我看到在行之后创建了100个连接: 。。。正在运行。我肯定这不是命中注定的,对吧?它应该在稍后执行pooledDataSource时创建连接。getConnection()。 我做错了什么?为什么它会立即创建100个连接??

    • 问题内容: 对于我的应用程序,我需要在运行时进行动态数据库连接。我知道,有多种方法可以创建多个数据源,但我认为它们并不是那么动态。设想: 用户可以输入数据库凭据并连接到远程数据库,以将单个行和表导入另一个数据库。为此,我需要动态连接到远程数据库。 我试图在服务中做到这一点,就像他们在“如果在grails中使用groovy sql类”中 所说的那样,它是否使用grails连接池? 注意:在这种情况下

    • 我尝试使用这里的示例代码在<code>中绘制<code>iGraph<code>网络图,并在我自己的<code>数据中使用shoehorn。帧,而不是使用示例空手道俱乐部数据。绘制图形时,它似乎忽略了边缘列表,并且正在进行一系列随机连接。我认为标签或边缘都是错的,但我不知道。 当我运行这个时,我得到了这个漂亮的iGraph,它由绘制。但是,边是不正确的。似乎只有ID的1-10正在连接,并且只有其他

    • 很好的一天! 我正在从glassfish迁移到JBoss 7.1.3。我有。无法创建远程连接的ear应用程序。我猜我的EJB有问题。 下面是我部署的EJB(来自服务器日志) 下面是我在资源调配器中的上下文查找。java代码 下面我已经粘贴了我的服务器。日志和我的应用程序日志供您参考。我遇到错误,比如无法创建远程连接。我在加载包含上述属性的初始上下文时遇到问题。。。ctx=新的初始上下文(jndiP

    • 我创建了一个ssl mongodb连接,如下所示 但在那之后,其他外部rest调用(用于翻译api,google的示例获取语言)失败,并给出以下错误。 由:sun.security.validator.validatoreXception:PKIX路径生成失败:sun.security.provider.certPath.SunCertPathBuilderException:找不到请求目标的有效