UDP-пакеты не отправляются на iPhone - PullRequest
0 голосов
/ 25 марта 2012

Я использую эту библиотеку: https://github.com/robbiehanson/CocoaAsyncSocket

Мой тестовый код:

#import <UIKit/UIKit.h>
@class GCDAsyncUdpSocket;

@interface ThirdViewController : UIViewController
{
    GCDAsyncUdpSocket *udpSocket;
}

.m:

#import "ThirdViewController.h"
#import "DDLog.h"
#import "DDTTYLogger.h"
#import "GCDAsyncUdpSocket.h"
static const int ddLogLevel = LOG_LEVEL_VERBOSE;

@implementation ThirdViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    [udpSocket bindToPort:7744 error:nil];
    [udpSocket beginReceiving:nil];
    [udpSocket enableBroadcast:YES error:nil];
    //[udpSocket connectToHost:@"127.0.0.1" onPort:55544 error:nil];

    NSData *data = [@"test" dataUsingEncoding:NSUTF8StringEncoding];

    //[udpSocket sendData:data withTimeout:-1 tag:0];
    [udpSocket sendData:data toHost:@"127.0.0.1" port:55544 withTimeout:-1 tag:0];
}

Но посылка не отправлена.Я использовал этот анализатор пакетов: http://sourceforge.net/projects/packetpeeper/

В библиотеке есть пример клиента (для Mac), его пакеты я вижу.Я пытался запустить приложение на реальном устройстве, но тоже ничего не отправлялось (адрес, конечно, был другой).В чем проблема?

1 Ответ

1 голос
/ 25 марта 2012

Вы прослушиваете порт 7744 и передаете на порт 55544.Вы должны передавать на тот же порт, на котором вы слушаете.т.е. отправка должна быть:

[udpSocket sendData:data toHost:@"127.0.0.1" port:7744 withTimeout:-1 tag:0];

Обоснованное предположение о том, почему хранитель пакетов не видит пакеты, потому что они не выходят из какого-либо сетевого интерфейса - это общая оптимизация, что пакеты для lo устройства (127.0.0.1) не выходят на провод;они просто зациклены на местном уровне.Большинство устройств перехвата пакетов не могут обнаружить пакеты этого типа.

Редактировать Вам нужно как минимум два GDCAsyncUdpSocket s - один для клиента, один для сервера.Самый простой способ сделать это - создать два отдельных приложения, одно из которых будет работать как сервер, а другое - как клиент.

Этот ThirdViewController является клиентом UDP некоторой формы.Когда вы запускаете bindToPort, вам нужно использовать номер порта 0, это заставляет ОС выделять порт для этой системы, который используется для прослушивания.Это необходимо, если вы когда-нибудь захотите получить пакет, отправленный с сервера.

[udpSocket bindToPort:0 error:nil];

в сторону, я всегда буду проверять наличие ошибки на bindToPort.

На стороне сервера,вам нужно привязать к известному порту:

[serverSocket bindToPort:55544 error:nil];

На стороне клиента, когда вы отправляете сообщение, которое вам нужно сделать (для симулятора):

[udpSocket sendData:data toHost:@"127.0.0.1" port:55544 withTimeout:-1 tag:0];

На сервересторона, когда вы получаете сообщение в обработчике didReceiveData, вам передается fromAddress.Этот адрес соответствует адресу и порту от udpSocket, и если вы хотите передать сообщение обратно клиенту, вы можете использовать:

[serverSocket sendData:data toAddress:fromAddress withTimeout:-1 tag:0];

У меня не было проблем с отправкой пакетов на serverSocket из udpSocket и обработки ответов, когда я следовал этой методологии.Я использую Wireshark на стороне Mac, чтобы увидеть пакеты, поступающие от iDevice.Когда я использовал симулятор, я отправил на 127.0.0.1 и увидел ответы на сервере.

...