我正在尝试通过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(&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> broadcastthost。50000: UDP,长度9
看起来基本OK,但由于某种原因没有到达Quartz Composer,我猜应该有IP地址或其他东西而不是' broadcastthost '。
任何想法?
问题不在于广播器的实现,而在于字符串的格式。要使用Quartz Composer,每个字符之前都需要有一个反斜杠-零组合:" ",所以"abc"必须格式化并发送为" a b c"。
参见Celso Martinho的博客文章:Leopard的Quartz Composer和网络事件
我建议使用AsyncSocket(谷歌它,它在googlecode上),非常经过测试的objective-c代码,运行在iOS上。
那样你可以很容易地使用NSData对象发送数据。AsyncSocket为你管理困难的部分。
如果这不是一个选项,你应该使用CFSocket。你正在做的是实现已经为你写的代码,CFSocket。