<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>veys.com &#187; cocoa touch</title>
	<atom:link href="http://veys.com/tag/cocoa-touch/feed/" rel="self" type="application/rss+xml" />
	<link>http://veys.com</link>
	<description>if I only had a tagline.</description>
	<lastBuildDate>Tue, 27 Sep 2011 21:35:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Time to broadcast, iPhone style</title>
		<link>http://veys.com/2009/06/27/time-to-broadcast-iphone-style/</link>
		<comments>http://veys.com/2009/06/27/time-to-broadcast-iphone-style/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 22:40:56 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[broadcast]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[objective c]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[udp]]></category>

		<guid isPermaLink="false">http://veys.com/?p=346</guid>
		<description><![CDATA[Ran into a need to dynamically determine the current UDP broadcast address for the WiFi interface on the ole&#8217; iPhone. Since NSHost appears to be a private API even w/the 3.0 software, it seems one must go lower. I wrapped it up in a neat little bundle that seems fairly usable if not verbose and [...]]]></description>
			<content:encoded><![CDATA[<p>Ran into a need to dynamically determine the current UDP broadcast address for the WiFi interface on the ole&#8217; iPhone.  Since NSHost appears to be a private API even w/the 3.0 software, it seems one must go lower.  I wrapped it up in a neat little bundle that seems fairly usable if not verbose and full of magic (but understandable) numbers.</p>
<p>A few things of note. en0 is the WiFi interface.  There are others.  Instrument the following code w/some debug to get them all out.  The ip/netmask methods return nil when the WiFi interface is not active.  I would also be shocked if there were no corner cases I am ignoring&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#include &lt;arpa/inet.h&gt;</span>
<span style="color: #6e371a;">#include &lt;net/if.h&gt;</span>
<span style="color: #6e371a;">#include &lt;sys/ioctl.h&gt;</span>
<span style="color: #6e371a;">#include &lt;sys/socket.h&gt;</span>
<span style="color: #6e371a;">#include &lt;errno.h&gt;</span>
<span style="color: #6e371a;">#include &lt;ifaddrs.h&gt;</span>
<span style="color: #6e371a;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>kWifiInterface <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;en0&quot;</span>;
&nbsp;
<span style="color: #a61390;">@implementation</span> NetUtil
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>broadcastAddressForAddress<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>ipAddress withMask<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>netmask <span style="color: #002200;">&#123;</span>
    NSAssert<span style="color: #002200;">&#40;</span><span style="color: #a61390;">nil</span> <span style="color: #002200;">!=</span> ipAddress, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;IP address cannot be nil&quot;</span><span style="color: #002200;">&#41;</span>;
    NSAssert<span style="color: #002200;">&#40;</span><span style="color: #a61390;">nil</span> <span style="color: #002200;">!=</span> netmask, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Netmask cannot be nil&quot;</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>ipChunks <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>ipAddress componentsSeparatedByString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;.&quot;</span><span style="color: #002200;">&#93;</span>;
    NSAssert<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>ipChunks count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">4</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;IP does not have 4 octets!&quot;</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>nmChunks <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>netmask componentsSeparatedByString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;.&quot;</span><span style="color: #002200;">&#93;</span>;
    NSAssert<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>nmChunks count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">4</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Netmask does not have 4 octets!&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
    NSUInteger ipRaw <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
    NSUInteger nmRaw <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
    NSUInteger shift <span style="color: #002200;">=</span> <span style="color: #2400d9;">24</span>;
    <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>NSUInteger i <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; i &lt; <span style="color: #2400d9;">4</span>; <span style="color: #002200;">++</span>i, shift <span style="color: #002200;">-=</span> <span style="color: #2400d9;">8</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        ipRaw |<span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>ipChunks objectAtIndex<span style="color: #002200;">:</span>i<span style="color: #002200;">&#93;</span> intValue<span style="color: #002200;">&#93;</span> &lt;&lt; shift;
        nmRaw |<span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>nmChunks objectAtIndex<span style="color: #002200;">:</span>i<span style="color: #002200;">&#93;</span> intValue<span style="color: #002200;">&#93;</span> &lt;&lt; shift;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    NSUInteger bcRaw <span style="color: #002200;">=</span> ~nmRaw | ipRaw;
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%d.%d.%d.%d&quot;</span>, <span style="color: #002200;">&#40;</span>bcRaw <span style="color: #002200;">&amp;</span> 0xFF000000<span style="color: #002200;">&#41;</span> &gt;&gt; <span style="color: #2400d9;">24</span>,
            <span style="color: #002200;">&#40;</span>bcRaw <span style="color: #002200;">&amp;</span> 0x00FF0000<span style="color: #002200;">&#41;</span> &gt;&gt; <span style="color: #2400d9;">16</span>, <span style="color: #002200;">&#40;</span>bcRaw <span style="color: #002200;">&amp;</span> 0x0000FF00<span style="color: #002200;">&#41;</span> &gt;&gt; <span style="color: #2400d9;">8</span>, bcRaw <span style="color: #002200;">&amp;</span> 0x000000FF<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>ipAddressForInterface<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>ifName <span style="color: #002200;">&#123;</span>
    NSAssert<span style="color: #002200;">&#40;</span><span style="color: #a61390;">nil</span> <span style="color: #002200;">!=</span> ifName, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Interface name cannot be nil&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
    <span style="color: #a61390;">struct</span> ifaddrs <span style="color: #002200;">*</span>addrs <span style="color: #002200;">=</span> <span style="color: #a61390;">NULL</span>;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>getifaddrs<span style="color: #002200;">&#40;</span><span style="color: #002200;">&amp;</span>addrs<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Failed to enumerate interfaces: %@&quot;</span>, <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span><span style="color: #a61390;">strerror</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">errno</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">/* walk the linked-list of interfaces until we find the desired one */</span>
    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>addr <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #a61390;">struct</span> ifaddrs <span style="color: #002200;">*</span>curAddr <span style="color: #002200;">=</span> addrs;
    <span style="color: #a61390;">while</span> <span style="color: #002200;">&#40;</span>curAddr <span style="color: #002200;">!=</span> <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>AF_INET <span style="color: #002200;">==</span> curAddr<span style="color: #002200;">-</span>&gt;ifa_addr<span style="color: #002200;">-</span>&gt;sa_family<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
            <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>curName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span>curAddr<span style="color: #002200;">-</span>&gt;ifa_name<span style="color: #002200;">&#93;</span>;
            <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>ifName isEqualToString<span style="color: #002200;">:</span>curName<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
                <span style="color: #a61390;">char</span><span style="color: #002200;">*</span> cstring <span style="color: #002200;">=</span> inet_ntoa<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">struct</span> sockaddr_in <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>curAddr<span style="color: #002200;">-</span>&gt;ifa_addr<span style="color: #002200;">&#41;</span><span style="color: #002200;">-</span>&gt;sin_addr<span style="color: #002200;">&#41;</span>;
                addr <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span>cstring<span style="color: #002200;">&#93;</span>;
                <span style="color: #a61390;">break</span>;
            <span style="color: #002200;">&#125;</span>
        <span style="color: #002200;">&#125;</span>
        curAddr <span style="color: #002200;">=</span> curAddr<span style="color: #002200;">-</span>&gt;ifa_next;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">/* clean up, return what we found */</span>
    freeifaddrs<span style="color: #002200;">&#40;</span>addrs<span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">return</span> addr;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>ipAddressForWifi <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>NetUtil ipAddressForInterface<span style="color: #002200;">:</span>kWifiInterface<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>netmaskForInterface<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>ifName <span style="color: #002200;">&#123;</span>
    NSAssert<span style="color: #002200;">&#40;</span><span style="color: #a61390;">nil</span> <span style="color: #002200;">!=</span> ifName, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Interface name cannot be nil&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
    <span style="color: #a61390;">struct</span> ifreq ifr;
    <span style="color: #a61390;">strncpy</span><span style="color: #002200;">&#40;</span>ifr.ifr_name, <span style="color: #002200;">&#91;</span>ifName UTF8String<span style="color: #002200;">&#93;</span>, IFNAMSIZ<span style="color: #002200;">-</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">int</span> fd <span style="color: #002200;">=</span> socket<span style="color: #002200;">&#40;</span>AF_INET, SOCK_DGRAM, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">1</span> <span style="color: #002200;">==</span> fd<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Failed to open socket to get netmask&quot;</span><span style="color: #002200;">&#41;</span>;
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">1</span> <span style="color: #002200;">==</span> ioctl<span style="color: #002200;">&#40;</span>fd, SIOCGIFNETMASK, <span style="color: #002200;">&amp;</span>ifr<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Failed to read netmask: %@&quot;</span>, <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span><span style="color: #a61390;">strerror</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">errno</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
        close<span style="color: #002200;">&#40;</span>fd<span style="color: #002200;">&#41;</span>;
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    close<span style="color: #002200;">&#40;</span>fd<span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>cstring <span style="color: #002200;">=</span> inet_ntoa<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">struct</span> sockaddr_in <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&amp;</span>ifr.ifr_addr<span style="color: #002200;">&#41;</span><span style="color: #002200;">-</span>&gt;sin_addr<span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithCString<span style="color: #002200;">:</span>cstring<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>netmaskForWifi <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>NetUtil netmaskForInterface<span style="color: #002200;">:</span>kWifiInterface<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://veys.com/2009/06/27/time-to-broadcast-iphone-style/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  veys.com/tag/cocoa-touch/feed/ ) in 0.56985 seconds, on Feb 6th, 2012 at 8:57 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 6th, 2012 at 8:59 am UTC -->
