Sorry for all the pings, but it appears that the code below doesn’t work after 
all;

> fatal error: can't unsafeBitCast between types of different sizes

So the question remains on how to perform the casts using Swift?

—
Bouke

> On 12 sep. 2016, at 21:37, Bouke Haarsma <bo...@haarsma.eu> wrote:
> 
> 
> Sorry, missed the first line when copying:
> 
> let generic = unsafeBitCast(CFDataGetBytePtr(data), to: sockaddr.self)
> switch generic.sa_family {
> case sa_family_t(AF_INET):
>     let ipv4 = unsafeBitCast(generic, to: sockaddr_in.self)
>     //...
> case sa_family_t(AF_INET6):
>     let ipv6 = unsafeBitCast(generic, to: sockaddr_in6.self)
>     //...
> default:
>     //...
> }
> 
> —
> Bouke
> 
>> On 12 sep. 2016, at 21:35, Bouke Haarsma <bo...@haarsma.eu 
>> <mailto:bo...@haarsma.eu>> wrote:
>> 
>> Ah the missing part of the puzzle appears to be unsafeBitCast(:to:), so the 
>> Swift version becomes this:
>> 
>> switch generic.sa_family {
>> case sa_family_t(AF_INET):
>>     let ipv4 = unsafeBitCast(generic, to: sockaddr_in.self)
>>     //...
>> case sa_family_t(AF_INET6):
>>     let ipv6 = unsafeBitCast(generic, to: sockaddr_in6.self)
>>     //...
>> default:
>>     //...
>> }
>> 
>> —
>> Bouke
>> 
>>> On 12 sep. 2016, at 21:25, Bouke Haarsma <bo...@haarsma.eu 
>>> <mailto:bo...@haarsma.eu>> wrote:
>>> 
>>> Hi all,
>>> 
>>> Inside my CFSocketCallBack a pointer to a sockaddr is provided wrapped in a 
>>> CFData structure. The sockaddr could be either a sockaddr_in (IPv4) or 
>>> sockaddr_in6 (IPv6) struct. In order to discover which struct you’re 
>>> dealing with, the attribute sa_family can be inspected. In C this would 
>>> look something like this:
>>> 
>>> struct sockaddr_storage sa;
>>> 
>>> switch (((sockaddr*)&sa)->sa_family)
>>> {
>>>     case AF_INET:
>>>         inet_ntop(AF_INET, &(((sockaddr_in*)&sa)->sin_addr), ...);
>>>         break;
>>>     case AF_INET6:
>>>         inet_ntop(AF_INET6, &(((sockaddr_in6*)&sa)->sin6_addr), ...);
>>>         break;
>>> }
>>> (from: http://stackoverflow.com/a/13167913 
>>> <http://stackoverflow.com/a/13167913>)
>>> 
>>> Wheras to do this in Swift 3, the only way I found thus far is this:
>>> 
>>> var generic = CFDataGetBytePtr(data).withMemoryRebound(to: sockaddr.self, 
>>> capacity: 1) {
>>>     return $0.pointee
>>> }
>>> switch generic.sa_family {
>>> case sa_family_t(AF_INET):
>>>     let ipv4 = withUnsafePointer(to: &generic) {
>>>         $0.withMemoryRebound(to: sockaddr_in.self, capacity: 1) {
>>>             $0.pointee
>>>         }
>>>     }
>>>     //...
>>> case sa_family_t(AF_INET6):
>>>     let ipv6 = withUnsafePointer(to: &generic) {
>>>         $0.withMemoryRebound(to: sockaddr_in6.self, capacity: 1) {
>>>             $0.pointee
>>>         }
>>>     }
>>>     //...
>>> default:
>>>     //…
>>> }
>>> 
>>> This looks very ugly with all the closures and ``withMemoryRebound``. Is 
>>> there a better way to do this? I think there should be something more 
>>> “Swifty”.
>>> 
>>> —
>>> Bouke
>> 
> 

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to