[英]how to establish a p2p connection between the iphone and the simulator
我想在兩個同伴之間傳輸數據。 所以我想我將從嘗試在兩者之間發送簡單的字符串消息開始(甚至只是檢查我是否可以在兩者之間建立連接)。 我正在使用我的iPhone和模擬器。 最終,該應用將不得不在跨平台(android / ios)上運行,因此我使用的POSIX C網絡API可以在本文檔中閱讀的跨平台上運行。 我從自己的代碼和其他來源(例如SO, 此處 , 此處和此處)中編譯了代碼。 從我收集到的信息來看,每個對等方都可以充當服務器或客戶端,因此對於服務器部分,到目前為止,我的代碼是:
-(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 ?,實際上任何建議,建議或指示都將非常有幫助。
非常感謝閱讀了整個問題的人,並非常感謝能夠幫助您的任何人...
所以我終於有了模擬器和手機來交換消息
首先,我停止這樣做:
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()函數,然后做到了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.