【发布时间】:2013-11-21 16:22:34
【问题描述】:
我想在两个对等方之间传输数据。所以我想我会先尝试在两者之间发送一个简单的字符串消息(或者甚至只是检查我是否可以在两者之间建立连接)。我正在使用我的 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 方法。
当我的视图控制器加载时,我初始化服务器对象并且我有一个按钮调用 setNetworkSocketStream:(CFStringRef)@"94.21.53.41" withPortNumber:(UInt32)21360
所以我在模拟器上运行它,当我按下调用 setNetworkSocketStream 的按钮时
我收到如下回复: 新的套接字响应:12, 流事件 1, 流打开, 流事件 1, 流打开, 流媒体事件 4, StreamEventHasSpaceAvailable, 直播活动 2,
所以我尝试只在没有服务器类初始化的情况下在我的手机上同时运行它, 但是当我从那里调用 setNetworkSocketStream 时没有任何反应
我认为如果两者之间有联系,我会从 handleEvent 中获取一些事件,但什么都没有......
所有这些网络编程对我来说都是非常新的,所以我可能在此过程中犯了很多错误。
毕竟,我的问题是,是否有人能指出我为什么无法建立连接?我的代码是否甚至可以远程关闭以建立成功的连接?模拟器和iphone?,真的任何建议,建议或指针都会非常有帮助。
非常感谢通读整个问题的任何人,并且非常感谢任何可以提供帮助的人......
【问题讨论】:
-
我没有看你的代码,有点忙于其他事情。但我的建议是,由于您是网络编程新手,请停止使用模拟器和手机进行尝试。第二,如果一个充当客户端,另一个充当客户端,那么它是客户端服务器架构。为了建立 P2P,您需要进行打孔。我有一个使用 boost asio 网络库构建的 p2p,它在 mac windows ubuntu iphone 和 android 上运行。所以可以做的只是尝试在 PC 上进行测试,然后将其编译到手机上。
-
这样更容易测试。如果您将其用作客户端服务器,那么您不应该该服务器应该具有打开特定端口的公共 IP。
-
感谢您的建议,我将检查 boost asio 库,看看是否可以使用它
标签: ios iphone objective-c c p2p