OStack程序员社区-中国程序员成长平台

标题: ios - 如何在iphone和模拟器之间建立p2p连接 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 16:39
标题: ios - 如何在iphone和模拟器之间建立p2p连接

我想在两个对等方之间传输数据。所以我想我会先尝试在两者之间发送一个简单的字符串消息(或者甚至只是检查我是否可以在两者之间建立连接)。我正在使用我的 iPhone 和模拟器。 最终,该应用程序必须跨平台(android/ios)工作,所以我使用的是 POSIX C 网络 API,正如我在文档中阅读的那样,它将跨平台工作。 我从自己的代码和其他来源(例如 SO、here)编译了代码。 , herehere . 从我收集的信息来看,每个对等点都能够充当服务器或客户端, 所以对于服务器部分,我目前拥有的是这段代码:

-(id) init {
self = [super init];
if (self) {
    memset(&sin, 0, sizeof(sin));
    sin.sin_len = sizeof(sin);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(21360);

    if (inet_pton(AF_INET, "94.21.53.41", &(sin.sin_addr)) < 0) {
        NSLog(@"Error while converting IP");
    }
    if ((self.serverSocket = socket(PF_INET, SOCK_STREAM, 0))) {
         NSLog(@"socket retrieve success");
    }
    if (bind(self.serverSocket, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
        NSLog(@"Error while binding");
    }
    len = sizeof(sin);
    if (getsockname(self.serverSocket, (struct sockaddr *)&sin, &len) < 0) {
        // Handle error here
    }
    int socket_port = ntohs(sin.sin_port);
    if (listen(self.serverSocket, 5) < 0) {
        NSLog(@"Error while listening");
    }
    NSThread *acceptConnectionThread = [[NSThread alloc] initWithTarget:self      selectorselector(startAcceptingConnections) object:nil];

    [acceptConnectionThread start];  
}
return self;
}

-(void) startAcceptingConnections {
self.clientSocket = accept(self.serverSocket, (struct sockaddr *)&sin, &len);
NSLog(@"new socket response: %d", self.clientSocket);

}
@end

为了建立连接,我正在调用 setNetworkSocketStream:

- (void) setNetworkSocketStreamCFStringRef) host withPortNumberUInt32) port; {
CFStreamCreatePairWithSocketToHost(NULL, host, port, &readStream, &writeStream);

inputStream = (__bridge_transfer NSInputStream *)readStream;
[inputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];

outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream open]; 
}

我已经从 NSStreamDelegate 实现了 handleEvent 方法。

当我的 View Controller 加载时,我初始化服务器对象并且我有一个按钮调用 setNetworkSocketStreamCFStringRef)@"94.21.53.41"withPortNumberUInt32)21360

所以我在模拟器上运行它,当我按下调用 setNetworkSocketStream 的按钮时

我收到如下回复: 新的套接字响应:12, 流事件 1, 流打开, 流事件 1, 流打开, 流媒体事件 4, StreamEventHasSpaceAvailable, 直播事件 2,

所以我尝试只在没有服务器类初始化的情况下在我的手机上同时运行它, 但是当我从那里调用 setNetworkSocketStream 时没有任何反应

我认为如果两者之间有联系,我会从 handleEvent 中获取一些事件,但什么都没有......

所有这些网络编程对我来说都是非常新的,所以我可能在此过程中犯了很多错误。

毕竟,我的问题是,是否有人可以指出我为什么无法建立连接?我的代码是否甚至可以远程关闭以建立成功的连接?模拟器和iphone?,真的任何建议,建议或指针都会非常有帮助。

非常感谢通读整个问题的任何人,并且非常感谢任何可以提供帮助的人......



Best Answer-推荐答案


所以我终于得到了模拟器和我的手机来交换消息

首先,我不再这样做了:

tried running it at the same time on my phone only without the server class init, but when i call setNetworkSocketStream from there nothing happens

第二,我正在使用:

NSString *response  = self.sendMessage.text;
NSLog(@"%@", response);
NSData *data = [[NSData alloc] initWithData:[response     dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];

在两者之间发送消息,由于某种原因不起作用,所以我将消息发送方法切换到 C 的 send() 函数并做到了。

关于ios - 如何在iphone和模拟器之间建立p2p连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126405/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4