ios - 如何在iphone和模拟器之间建立p2p连接

标签 ios iphone objective-c c 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      selector:@selector(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) setNetworkSocketStream:(CFStringRef) host withPortNumber:(UInt32) 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 加载时,我初始化服务器对象并且我有一个调用 setNetworkSocketStream:(CFStringRef)@"94.21.53.41"withPortNumber:(UInt32)21360 的按钮

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

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

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

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

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

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

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

最佳答案

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

首先,我停止这样做:

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/

相关文章:

ios - 将数据从一个 ViewController 发送到另一个。

objective-c - "property is backed by an ivar"?这在技术上意味着什么?

c# - 如何在 MonoTouch 中检测 Retina 显示屏

ios - 为什么 SFSafariWebViewController 没有正确地与 Safari 共享 cookie?

ios - Swift Firebase 如何向我的用户添加自定义分支?

iOS 媒体库 : React to Access Apple Music Alert

ios - 想要将来自推特的好友列表显示到 iPhone 应用程序中

iphone - 自定义背景不在 View 更改时设置动画

iphone - 在 iOS 上使用 OpenGL ES 模拟多边形点画

ios - xcode UILabel 文本适合 Storyboard 但不适合设备