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