iOS UDP广播与PHP UDP广播

时间:2011-05-05 17:11:25

标签: networking 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.="\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&gt; 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&gt; broadcasthost.50000:UDP,长度为9

看起来基本没问题,但由于某种原因没有到达Quartz Composer,我猜应该有IP地址或者其他东西而不是'broadcasthost'。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

问题不在于广播公司的实施,而在于字符串的格式。要使用Quartz Composer,每个字符都需要以反斜杠 - 零组合开头:“\ 0 \ 0 \ 0”,因此必须格式化“abc”并将其作为“\ 0 \ 0 \ 0a \ 0 \ 0”发送\ 0B \ 0 \ 0 \ 0℃”。

另见Celso Martinho's blog article: Leopard’s Quartz Composer and Network events

答案 1 :(得分:0)

我建议使用AsyncSocket(google it,它在googlecode上),在iOS上运行的经过良好测试的Objective-c代码。

通过这种方式,您可以使用NSData对象轻松发送数据。 AsyncSocket为您管理难题。

如果这不适合你,你应该使用CFSocket。你正在做的是实现已经为你编写的代码,CFSocket。