簡體   English   中英

如何在iPhone和模擬器之間建立P2P連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM