Маленькая проблема с AsyncUdpSocket получения данных после подключения к трансляции вместо сервера - PullRequest
8 голосов
/ 26 апреля 2011

У меня проблема с AsyncUdpSocket.

Раньше я подключался к серверу, отправлял некоторые данные и получал ответ. Теперь, поскольку я не знаю фактический адрес сервера, мне пришлось изменить свой код и отправить данные на широковещательный адрес 255.255.255.255.

Вот мой код:

NSString *bchost = @"255.255.255.255";
NSString *host = @"10.1.0.1";
int udpPort = 6001;

AsyncUdpSocket *udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[udpSocket bindToPort:udpPort error:nil];
[udpSocket enableBroadcast:YES error:nil]; 
NSError *error = nil;
if ([udpSocket connectToHost:bchost onPort:udpPort error:&error])
{
[udpSocket receiveWithTimeout:10 tag:0];
[self sendToUDPServer:@"HELLO"];
}

Итак, проблема в том, что он работает с "host", а не с "bchost". В обоих случаях я вижу на стороне сервера, что данные получены, и ответ отправлен на адрес отправителя (который должен быть устройством iOS), но на устройстве я не получаю данные, когда отправляю их в bchost.

Есть идеи, что мне не хватает?

Ответы [ 4 ]

4 голосов
/ 07 октября 2011

Хорошо, к сожалению, все ответы у меня не работают, но я наконец нашел решение;)

NSString *bcHost = @"255.255.255.255";
NSString *anyHost = @"0.0.0.0";

int UDP_SOCKET_PORT =         6001;
int DISCOVERY_PORT  =       6003;

udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[udpSocket bindToAddress:anyHost port:DISCOVERY_PORT error:nil];  
[udpSocket enableBroadcast:YES error:nil]; 
[udpSocket receiveWithTimeout:10 tag:0];
[udpSocket sendData:[@"Hello" dataUsingEncoding:NSASCIIStringEncoding] toHost:bcHost port:UDP_SOCKET_PORT withTimeout:-1 tag:0];

Если за ним находится сервер, он вызовет ответ, что также позволит получить IP-адрес от сервера для дальнейшей обработки.

3 голосов
/ 15 июня 2011

Вы «подключаетесь» к хосту.Согласно FAQ по сокету Unix , это означает, что вы получите обратно только те пакеты UDP, которые имеют исходный IP-адрес 255.255.255.255.Соединение устанавливает отношение «1 к 1» для UDP, так что полученные пакеты, чьи исходные адреса отличаются от подключенного адреса, будут отфильтрованы.

Если вы не подключаетесь (вам придется изменить линию отправкидля таргетинга на широковещательный адрес), оно должно работать.Вы отправите toHost:bcHost - и тогда ваш получатель должен получить все пакеты, предназначенные для его порта.

3 голосов
/ 07 октября 2011

Основываясь на ответе Артура, вот рабочий код.Мне интересно, должен ли прием начаться до отправки, просто чтобы убедиться, что мы не пропустили очень быстрый ответ до того, как прием будет готов, но пока в моей ситуации это не кажется необходимым.Также, ссылка в этом посте о том, как создавать методы получения.

AsyncUdpSocket *udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[udpSocket bindToPort:1234 error:nil ];
[udpSocket enableBroadcast:YES error:nil];

NSData* data=[messageToSend dataUsingEncoding:NSUTF8StringEncoding];

if ([udpSocket sendData:data toHost:@"255.255.255.255" port:4321 withTimeout:3 tag:0])
{
    //2 second timeout. onUdpSocket methods will provide results
    [udpSocket receiveWithTimeout:2 tag:0];
}
0 голосов
/ 14 июня 2011

Я могу быть совершенно сумасшедшим, но похоже, что это постоянная проблема с AsyncUdpSocket на iOS.

На их странице Google Code есть несколько отчетов об ошибках, похожих и даже похожих на ваши;люди жаловались, что они не могут получать пакеты Udp после широковещательной передачи, а в некоторых случаях даже вообще.

http://code.google.com/p/cocoaasyncsocket/issues/list?can=2&q=AsyncUdpSocket+receive

...