GCDAsyncUdpSocket三方库很好用,而且是开源的。
使用GCDAsyncUdpSocket发送组播数据,默认TTL为1,想要修改为4,但是又不能改源码,因为不知道其他地方有没有改成其他的值,所以,研究了一下,通过下面的方法,即可修改。
self.udpWfgSocket = [[GCDAsyncUdpSocket alloc] init];
[self.udpWfgSocket setDelegate:self];
[self.udpWfgSocket setDelegateQueue:dispatch_get_main_queue()];
// 启动广播
[self.udpWfgSocket enableBroadcast:YES error:&error];
if (error != nil) {
dlogE(@"enable broadcase fail: %@", [error localizedDescription]);
[self.udpWfgSocket close];
self.udpWfgSocket = nil;
return ;
}
// 设置TTL
__block typeof(self) bself = self;
[self.udpWfgSocket performBlock:^{
char mcttl = 4;
int setttlok = 0;
int misfd = [bself.udpWfgSocket socketFD];
setttlok = setsockopt(misfd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&mcttl, sizeof(mcttl));
if (setttlok != 0) {
dlogE(@"set socket ttl fail: %d", setttlok);
[bself.udpWfgSocket close];
bself.udpWfgSocket = nil;
return ;
}
}];
要访问GCDAsyncUdpSocket对象中的socket,必须要在performBlock方法中才可以,否则就获取不到socket实例。