我想在两个对等体之间传输数据。所以我想我会开始尝试在两者之间发送一个简单的字符串消息(或者甚至只是检查我是否可以在两者之间建立连接)。我正在使用我的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,
所以我尝试在没有服务器类init的情况下在手机上同时运行它, 但当我从那里调用setNetworkSocketStream时没有任何事情发生
我认为如果两者之间存在连接,我会从handleEvent获取一些事件,但没有...
所有这些网络编程对我来说都是新的,所以我可能在此过程中犯了很多错误。
毕竟,我的问题是,如果有人能指出我为什么无法建立连接?,我的代码是否甚至远程关闭以建立成功的连接?,甚至可以用两者来测试这种情况模拟器和iPhone?,真的任何建议,建议或指示都会非常有帮助。
非常感谢任何阅读整个问题的人,并且非常感谢任何可以提供帮助的人......答案 0 :(得分:1)
所以我终于让模拟器和我的手机交换信息了
首先,我停止了这样做:
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()函数,并且就这样做了。