Differences From Artifact [584c86fff6]:
- File
src/OFUDPSocket.m
— part of check-in
[fb590316ba]
at
2014-01-30 12:26:12
on branch trunk
— Rename +[UDPSocket hostForAddress:port:]
It is now called +[getHost:andPort:forAddress:]. This makes it much
clearer from the selector alone what it actually does. (user: js, size: 6996) [annotate] [blame] [check-ins using]
To Artifact [4a64bf06a1]:
- File src/OFUDPSocket.m — part of check-in [ff3c507941] at 2014-01-30 22:02:07 on branch trunk — OFUDPSocket: Add async resolve / receive (user: js, size: 11111) [annotate] [blame] [check-ins using]
| ︙ | ︙ | |||
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include "config.h"
#include <string.h>
#include <assert.h>
#import "OFUDPSocket.h"
#import "OFBindFailedException.h"
#import "OFInvalidArgumentException.h"
#import "OFNotConnectedException.h"
#import "OFReadFailedException.h"
#import "OFWriteFailedException.h"
#import "macros.h"
#import "resolver.h"
#import "socket_helpers.h"
#ifdef __wii__
static uint16_t freePort = 65532;
#endif
bool
of_udp_socket_address_equal(of_udp_socket_address_t *address1,
of_udp_socket_address_t *address2)
{
struct sockaddr_in *sin_1, *sin_2;
#ifdef AF_INET6
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
#include "config.h"
#include <string.h>
#include <assert.h>
#import "OFUDPSocket.h"
#ifdef OF_HAVE_THREADS
# import "OFThread.h"
#endif
#import "OFRunLoop.h"
#import "OFRunLoop+Private.h"
#import "OFBindFailedException.h"
#import "OFInvalidArgumentException.h"
#import "OFNotConnectedException.h"
#import "OFReadFailedException.h"
#import "OFWriteFailedException.h"
#import "autorelease.h"
#import "macros.h"
#import "resolver.h"
#import "socket_helpers.h"
#ifdef __wii__
static uint16_t freePort = 65532;
#endif
#ifdef OF_HAVE_THREADS
@interface OFUDPSocket_ResolveThread: OFThread
{
OFThread *_sourceThread;
OFString *_host;
uint16_t _port;
id _target;
SEL _selector;
# ifdef OF_HAVE_BLOCKS
of_udp_socket_async_resolve_block_t _block;
# endif
of_udp_socket_address_t _address;
OFException *_exception;
}
- initWithSourceThread: (OFThread*)sourceThread
host: (OFString*)host
port: (uint16_t)port
target: (id)target
selector: (SEL)selector;
# ifdef OF_HAVE_BLOCKS
- initWithSourceThread: (OFThread*)sourceThread
host: (OFString*)host
port: (uint16_t)port
block: (of_udp_socket_async_resolve_block_t)block;
# endif
@end
@implementation OFUDPSocket_ResolveThread
- initWithSourceThread: (OFThread*)sourceThread
host: (OFString*)host
port: (uint16_t)port
target: (id)target
selector: (SEL)selector
{
self = [super init];
@try {
_sourceThread = [sourceThread retain];
_host = [host retain];
_port = port;
_target = [target retain];
_selector = selector;
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
# ifdef OF_HAVE_BLOCKS
- initWithSourceThread: (OFThread*)sourceThread
host: (OFString*)host
port: (uint16_t)port
block: (of_udp_socket_async_resolve_block_t)block
{
self = [super init];
@try {
_sourceThread = [sourceThread retain];
_host = [host copy];
_port = port;
_block = [block copy];
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
# endif
- (void)dealloc
{
[_sourceThread release];
[_host release];
[_target release];
# ifdef OF_HAVE_BLOCKS
[_block release];
# endif
[_exception release];
[super dealloc];
}
- (void)didResolve
{
[self join];
# ifdef OF_HAVE_BLOCKS
if (_block != NULL)
_block(_host, _port, _address, _exception);
# endif
else {
void (*func)(id, SEL, OFString*, uint16_t,
of_udp_socket_address_t, OFException*) =
(void(*)(id, SEL, OFString*, uint16_t,
of_udp_socket_address_t, OFException*))[_target
methodForSelector: _selector];
func(_target, _selector, _host, _port, _address, _exception);
# ifdef OF_HAVE_BLOCKS
}
# endif
}
- (id)main
{
void *pool = objc_autoreleasePoolPush();
@try {
[OFUDPSocket resolveAddressForHost: _host
port: _port
address: &_address];
} @catch (OFException *e) {
_exception = e;
}
[self performSelector: @selector(didResolve)
onThread: _sourceThread
waitUntilDone: false];
objc_autoreleasePoolPop(pool);
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 *sin_1, *sin_2;
#ifdef AF_INET6
|
| ︙ | ︙ | |||
156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
memcpy(&address->address, results[0]->address,
results[0]->addressLength);
address->length = results[0]->addressLength;
of_resolver_free(results);
}
+ (void)getHost: (OFString *__autoreleasing*)host
andPort: (uint16_t*)port
forAddress: (of_udp_socket_address_t*)address
{
of_address_to_string_and_port(
(struct sockaddr*)&address->address, address->length, host, port);
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
memcpy(&address->address, results[0]->address,
results[0]->addressLength);
address->length = results[0]->addressLength;
of_resolver_free(results);
}
#ifdef OF_HAVE_THREADS
+ (void)asyncResolveAddressForHost: (OFString*)host
port: (uint16_t)port
target: (id)target
selector: (SEL)selector
{
void *pool = objc_autoreleasePoolPush();
[[[[OFUDPSocket_ResolveThread alloc]
initWithSourceThread: [OFThread currentThread]
host: host
port: port
target: target
selector: selector] autorelease] start];
objc_autoreleasePoolPop(pool);
}
# ifdef OF_HAVE_BLOCKS
+ (void)asyncResolveAddressForHost: (OFString*)host
port: (uint16_t)port
block: (of_udp_socket_async_resolve_block_t)block
{
void *pool = objc_autoreleasePoolPush();
[[[[OFUDPSocket_ResolveThread alloc]
initWithSourceThread: [OFThread currentThread]
host: host
port: port
block: block] autorelease] start];
objc_autoreleasePoolPop(pool);
}
# endif
#endif
+ (void)getHost: (OFString *__autoreleasing*)host
andPort: (uint16_t*)port
forAddress: (of_udp_socket_address_t*)address
{
of_address_to_string_and_port(
(struct sockaddr*)&address->address, address->length, host, port);
|
| ︙ | ︙ | |||
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 |
if ((ret = recvfrom(_socket, buffer, length, 0,
(struct sockaddr*)&sender->address, &sender->length)) < 0)
@throw [OFReadFailedException exceptionWithObject: self
requestedLength: length];
return ret;
}
- (void)sendBuffer: (const void*)buffer
length: (size_t)length
receiver: (of_udp_socket_address_t*)receiver
{
if (_socket == INVALID_SOCKET)
@throw [OFNotConnectedException exceptionWithSocket: self];
if (sendto(_socket, buffer, length, 0,
(struct sockaddr*)&receiver->address, receiver->length) < length)
@throw [OFWriteFailedException exceptionWithObject: self
requestedLength: length];
}
- (int)fileDescriptorForReading
{
return _socket;
}
- (int)fileDescriptorForWriting
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 |
if ((ret = recvfrom(_socket, buffer, length, 0,
(struct sockaddr*)&sender->address, &sender->length)) < 0)
@throw [OFReadFailedException exceptionWithObject: self
requestedLength: length];
return ret;
}
- (void)asyncReceiveIntoBuffer: (void*)buffer
length: (size_t)length
target: (id)target
selector: (SEL)selector
{
[OFRunLoop OF_addAsyncReceiveForUDPSocket: self
buffer: buffer
length: length
target: target
selector: selector];
}
#ifdef OF_HAVE_BLOCKS
- (void)asyncReceiveIntoBuffer: (void*)buffer
length: (size_t)length
block: (of_udp_socket_async_receive_block_t)block
{
[OFRunLoop OF_addAsyncReceiveForUDPSocket: self
buffer: buffer
length: length
block: block];
}
#endif
- (void)sendBuffer: (const void*)buffer
length: (size_t)length
receiver: (of_udp_socket_address_t*)receiver
{
if (_socket == INVALID_SOCKET)
@throw [OFNotConnectedException exceptionWithSocket: self];
if (sendto(_socket, buffer, length, 0,
(struct sockaddr*)&receiver->address, receiver->length) < length)
@throw [OFWriteFailedException exceptionWithObject: self
requestedLength: length];
}
- (void)cancelAsyncRequests
{
[OFRunLoop OF_cancelAsyncRequestsForObject: self];
}
- (int)fileDescriptorForReading
{
return _socket;
}
- (int)fileDescriptorForWriting
|
| ︙ | ︙ |