UDP サーバーに接続してそこからデータを受信できる iOS 用のアプリケーションを作成しようとしています。私の状況:
- Windows マシン (IP = 192.168.1.6) に UDP サーバーがあります。
- 私は iPad (IP = 192.168.1.5) を持っています。
- UDP サーバーは、仮想アドレス (IP = 239.254.1.2) およびポート (7125) に、「HELLO!!!!! I'm here!!!!」のようなメッセージを送信します。
仮想 IP アドレス (IP = 239.254.1.2) とポート (7125) に接続して、「HELLO!!!!! I'm here!!!!」というメッセージを受信できる iOS アプリ用のロジックを追加する必要があります。UDP サーバーから。
誰か提案はありますか?
更新1:
UDP接続にはGCDAsyncUdpSocketを使用しています
ここに私のコード:
@interface ViewController () {
GCDAsyncUdpSocket *udpSocket;
}
- (void)viewDidLoad {
[super viewDidLoad];
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
}
- (IBAction)startStop:(id)sender {
if (isRunning) {
// STOP udp echo server
[udpSocket close];
[self logInfo:@"Stopped Udp Echo server"];
isRunning = false;
[portField setEnabled:YES];
[startStopButton setTitle:@"Start" forState:UIControlStateNormal];
} else {
// START udp echo server
int port = [portField.text intValue];
if (port < 0 || port > 65535) {
portField.text = @"";
port = 0;
}
NSError *error = nil;
if (![udpSocket bindToPort:7125 error:&error]) {
[self logError:FORMAT(@"Error starting server (bind): %@", error)];
return;
}
if (![udpSocket joinMulticastGroup:@"239.254.1.2" error:&error]) {
[self logError:FORMAT(@"Error join Multicast Group: %@", error)];
return;
}
if (![udpSocket beginReceiving:&error])
{
[udpSocket close];
[self logError:FORMAT(@"Error starting server (recv): %@", error)];
return;
}
[self logInfo:FORMAT(@"Udp Echo server started on port %hu", [udpSocket localPort])];
isRunning = YES;
[portField setEnabled:NO];
[startStopButton setTitle:@"Stop" forState:UIControlStateNormal];
}
}
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
if (!isRunning) return;
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (msg)
{
/* If you want to get a display friendly version of the IPv4 or IPv6 address, you could do this:
NSString *host = nil;
uint16_t port = 0;
[GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];
*/
[self logMessage:msg];
}
else
{
[self logError:@"Error converting received data into UTF-8 String"];
}
[udpSocket sendData:data toAddress:address withTimeout:-1 tag:0];
}
ログの「開始」ボタンを押すと、「Udp Echo サーバーがポート 7125 で開始されました」というメッセージが表示されますが、メソッドをデリゲートします
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
起動されず、アプリケーションは仮想 IP アドレスからメッセージを受信しません。この問題で私を助けてもらえますか?
ありがとうございました。