широковещательная рассылка iOS по сравнению с широковещательной передачей по PHP - PullRequest
1 голос
/ 05 мая 2011

Я пытаюсь отправить данные через 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.="\0\0\0".$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(&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 *)&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 *)&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-адрес или что-то в этом роде.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Проблема была не в реализации вещателя, а в формате строки. Для работы с Quartz Composer каждому символу должна предшествовать комбинация обратной косой черты и нуля: «\ 0 \ 0 \ 0», поэтому «abc» необходимо отформатировать и отправить как «\ 0 \ 0 \ 0a \ 0 \ 0 \ 0b \ 0 \ 0 \ 0с».

См. Также Статья в блоге Селсо Мартиньо: Quop Composer и сетевые события Leopard .

0 голосов
/ 05 мая 2011

Я предлагаю использовать AsyncSocket (google it, он на googlecode), очень хорошо протестированный код target-c, который работает на iOS.

Таким образом, вы действительно легко можете отправлять данные, используя объект NSData.AsyncSocket управляет трудной частью для вас.

Если это не вариант для вас, вы должны использовать CFSocket.Что вы делаете, так это реализуете код, который уже написан для вас, CFSocket.

...