#networking #ios4 #udp
#сеть #ios4 #udp
Вопрос:
Я пытаюсь отправить данные через UDP в сеть. У меня есть некоторый PHP-код, запущенный на моем локальном компьютере, который работает:
#!/usr/bin/php -q
<?php
$socket = stream_socket_client('udp://225.0.0.0:50000');
for($i=0;$i<strlen($argv[1]);$i ) $b.="".$argv[1][$i];
fwrite($socket,$b,strlen($argv[1])*4);
fclose($socket);
?>
Выдает мне результат в tcpdump:
18:53:24.504447 IP 10.0.1.2.52919 > 225.0.0.0.50000: UDP, длина 36
Я пытаюсь получить тот же результат на удаленной iOS с помощью следующего кода:
- (void)broadcast:(NSString *)dx {
NSData* data=[dx dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Broadcasting data: %@", dx);
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in addr4client;
memset(amp;addr4client, 0, sizeof(addr4client));
addr4client.sin_len = sizeof(addr4client);
addr4client.sin_family = AF_INET;
addr4client.sin_port = htons(PORT);
addr4client.sin_addr.s_addr = htonl(INADDR_BROADCAST);
int yes = 1;
if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (void *)amp;yes, sizeof(yes)) == -1) {
NSLog([NSString stringWithFormat:@"Failure to set broadcast! : %d", errno]);
}
char *toSend = (char *)[data bytes];
if (sendto(fd, toSend, [data length], 0, (struct sockaddr *)amp;addr4client, sizeof(addr4client)) == -1) {
NSLog([NSString stringWithFormat:@"Failure to send! : %d", errno]);
}
close(fd);
}
Что дает мне следующий вывод в tcpdump:
19:01:22.776192 IP 10.0.1.4.60643 > broadcasthost.50000: UDP, длина 9
Выглядит в принципе нормально, но по какой-то причине не отображается в Quartz Composer, я думаю, вместо ‘broadcasthost’ должен быть IP-адрес или что-то в этомроде.
Есть идеи?
Ответ №1:
Проблема была не в реализации вещателя, а в формате строки. Для работы с Quartz Composer каждому символу должна предшествовать комбинация обратной косой черты и нуля: «», итак, «abc» должен быть отформатирован и отправлен как » 0 0 0a 0 0 0b 0 0 0c».
Смотрите также статью Селсо Мартиньо в блоге: Leopard’s Quartz Composer и сетевые события.
Ответ №2:
Я предлагаю использовать AsyncSocket (google it, его в googlecode ), очень хорошо протестированный код objective-c, который работает на iOS.
Таким образом, вы можете очень легко отправлять данные, используя объект NSData. AsyncSocket выполняет самую сложную часть за вас.
Если это не вариант для вас, вам следует использовать CFSocket. То, что вы делаете, — это реализация кода, который уже был написан для вас, CFSocket.
Комментарии:
1. Часть документации «Использование AsyncSocket» пуста, и я не могу найти для нее соответствующую документацию. В чем преимущество ее использования, поскольку я уже собрал код для отправки? Мне не нужно ничего больше, чем эта трансляция.
2. Он чрезвычайно прост в использовании, вам не нужно писать никакого кода, кроме генерации данных и вызова writeData:yourData с TIMEOUT:-1
3. Спасибо. Я получил ошибку во время выполнения при попытке этого, поэтому я использовал код, который у меня был раньше с сокетом. Будем иметь это в виду в следующий раз.