@@ -54,11 +54,11 @@ SEL _selector; id _context; # ifdef OF_HAVE_BLOCKS of_udp_socket_async_resolve_block_t _block; # endif - of_udp_socket_address_t _address; + of_socket_address_t _address; id _exception; } - (instancetype)initWithSourceThread: (OFThread *)sourceThread host: (OFString *)host @@ -144,13 +144,13 @@ if (_block != NULL) _block(_host, _port, _address, _exception); else { # endif void (*func)(id, SEL, OFString *, uint16_t, - of_udp_socket_address_t, id, id) = + of_socket_address_t, id, id) = (void (*)(id, SEL, OFString *, uint16_t, - of_udp_socket_address_t, id, id)) + of_socket_address_t, id, id)) [_target methodForSelector: _selector]; func(_target, _selector, _host, _port, _address, _context, _exception); # ifdef OF_HAVE_BLOCKS @@ -179,122 +179,10 @@ return nil; } @end #endif -bool -of_udp_socket_address_equal(of_udp_socket_address_t *address1, - of_udp_socket_address_t *address2) -{ - struct sockaddr_in *addrIn1, *addrIn2; -#ifdef HAVE_IPV6 - struct sockaddr_in6 *addrIn6_1, *addrIn6_2; -#endif - - if (address1->address.ss_family != address2->address.ss_family) - return false; - - switch (address1->address.ss_family) { - case AF_INET: -#if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) - if (address1->length < (socklen_t)sizeof(struct sockaddr_in) || - address2->length < (socklen_t)sizeof(struct sockaddr_in)) - @throw [OFInvalidArgumentException exception]; -#else - if (address1->length < 8 || address2->length < 8) - @throw [OFInvalidArgumentException exception]; -#endif - - addrIn1 = (struct sockaddr_in *)&address1->address; - addrIn2 = (struct sockaddr_in *)&address2->address; - - if (addrIn1->sin_port != addrIn2->sin_port) - return false; - if (addrIn1->sin_addr.s_addr != addrIn2->sin_addr.s_addr) - return false; - - break; -#ifdef HAVE_IPV6 - case AF_INET6: - if (address1->length < sizeof(struct sockaddr_in6) || - address2->length < sizeof(struct sockaddr_in6)) - @throw [OFInvalidArgumentException exception]; - - addrIn6_1 = (struct sockaddr_in6 *)&address1->address; - addrIn6_2 = (struct sockaddr_in6 *)&address2->address; - - if (addrIn6_1->sin6_port != addrIn6_2->sin6_port) - return false; - if (memcmp(addrIn6_1->sin6_addr.s6_addr, - addrIn6_2->sin6_addr.s6_addr, - sizeof(addrIn6_1->sin6_addr.s6_addr)) != 0) - return false; - - break; -#endif - default: - @throw [OFInvalidArgumentException exception]; - } - - return true; -} - -uint32_t -of_udp_socket_address_hash(of_udp_socket_address_t *address) -{ - uint32_t hash = of_hash_seed; - struct sockaddr_in *addrIn; -#ifdef HAVE_IPV6 - struct sockaddr_in6 *addrIn6; - uint32_t subhash; -#endif - - hash += address->address.ss_family; - - switch (address->address.ss_family) { - case AF_INET: -#if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) - if (address->length < (socklen_t)sizeof(struct sockaddr_in)) - @throw [OFInvalidArgumentException exception]; -#else - if (address->length < 8) - @throw [OFInvalidArgumentException exception]; -#endif - - addrIn = (struct sockaddr_in *)&address->address; - - hash += (addrIn->sin_port << 1); - hash ^= addrIn->sin_addr.s_addr; - - break; -#ifdef HAVE_IPV6 - case AF_INET6: - if (address->length < sizeof(struct sockaddr_in6)) - @throw [OFInvalidArgumentException exception]; - - addrIn6 = (struct sockaddr_in6 *)&address->address; - - hash += (addrIn6->sin6_port << 1); - - OF_HASH_INIT(subhash); - - for (size_t i = 0; i < sizeof(addrIn6->sin6_addr.s6_addr); i++) - OF_HASH_ADD(subhash, adrIn6->sin6_addr.s6_addr[i]); - - OF_HASH_FINALIZE(subhash); - - hash ^= subhash; - - break; -#endif - default: - @throw [OFInvalidArgumentException exception]; - } - - return hash; -} - @implementation OFUDPSocket + (void)initialize { if (self != [OFUDPSocket class]) return; @@ -309,11 +197,11 @@ return [[[self alloc] init] autorelease]; } + (void)resolveAddressForHost: (OFString *)host port: (uint16_t)port - address: (of_udp_socket_address_t *)address + address: (of_socket_address_t *)address { of_resolver_result_t **results = of_resolve_host(host, port, SOCK_DGRAM); assert(results[0]->addressLength <= @@ -364,11 +252,11 @@ # endif #endif + (void)getHost: (OFString *__autoreleasing *)host andPort: (uint16_t *)port - forAddress: (of_udp_socket_address_t *)address + forAddress: (of_socket_address_t *)address { of_address_to_string_and_port( (struct sockaddr *)&address->address, address->length, host, port); } @@ -533,11 +421,11 @@ errNo: EAFNOSUPPORT]; } - (size_t)receiveIntoBuffer: (void *)buffer length: (size_t)length - sender: (of_udp_socket_address_t *)sender + sender: (of_socket_address_t *)sender { ssize_t ret; if (_socket == INVALID_SOCKET) @throw [OFNotOpenException exceptionWithObject: self]; @@ -592,11 +480,11 @@ } #endif - (void)sendBuffer: (const void *)buffer length: (size_t)length - receiver: (const of_udp_socket_address_t *)receiver + receiver: (const of_socket_address_t *)receiver { if (_socket == INVALID_SOCKET) @throw [OFNotOpenException exceptionWithObject: self]; #ifndef OF_WINDOWS @@ -635,11 +523,11 @@ errNo: 0]; } - (void)asyncSendBuffer: (const void *)buffer length: (size_t)length - receiver: (of_udp_socket_address_t)receiver + receiver: (of_socket_address_t)receiver target: (id)target selector: (SEL)selector context: (id)context { [OFRunLoop of_addAsyncSendForUDPSocket: self @@ -652,11 +540,11 @@ } #ifdef OF_HAVE_BLOCKS - (void)asyncSendBuffer: (const void *)buffer length: (size_t)length - receiver: (of_udp_socket_address_t)receiver + receiver: (of_socket_address_t)receiver block: (of_udp_socket_async_send_block_t)block { [OFRunLoop of_addAsyncSendForUDPSocket: self buffer: buffer length: length