Skip to content

Commit 0bc9afc

Browse files
committed
Merge branch 'master' of https://github.com/JohannesRudolph/CocoaAsyncSocket into JohannesRudolph-master
2 parents 093f4b3 + 84e3b8e commit 0bc9afc

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

GCD/GCDAsyncUdpSocket.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,9 @@ typedef BOOL (^GCDAsyncUdpSocketReceiveFilterBlock)(NSData *data, NSData *addres
382382
**/
383383
- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr;
384384

385+
- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr;
386+
- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr;
387+
385388
#pragma mark Broadcast
386389

387390
/**

GCD/GCDAsyncUdpSocket.m

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ - (void)doReceiveEOF;
204204

205205
- (void)closeWithError:(NSError *)error;
206206

207+
- (BOOL)performMulticastRequest:(int)requestType forGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr;
208+
207209
#if TARGET_OS_IPHONE
208210
- (BOOL)createReadAndWriteStreams:(NSError **)errPtr;
209211
- (BOOL)registerForStreamCallbacks:(NSError **)errPtr;
@@ -218,6 +220,9 @@ + (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6;
218220
+ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4;
219221
+ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6;
220222

223+
// Forward declaration
224+
+ (void)listenerThread;
225+
221226
@end
222227

223228
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -3242,6 +3247,24 @@ - (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr
32423247
}
32433248

32443249
- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr
3250+
{
3251+
// IP_ADD_MEMBERSHIP == IPV6_JOIN_GROUP
3252+
return [self performMulticastRequest:IP_ADD_MEMBERSHIP forGroup:group onInterface:interface error:errPtr];
3253+
}
3254+
3255+
3256+
- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr
3257+
{
3258+
return [self leaveMulticastGroup:group onInterface:nil error:errPtr];
3259+
}
3260+
3261+
- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr
3262+
{
3263+
// IP_DROP_MEMBERSHIP == IPV6_LEAVE_GROUP
3264+
return [self performMulticastRequest:IP_DROP_MEMBERSHIP forGroup:group onInterface:interface error:errPtr];
3265+
}
3266+
3267+
- (BOOL)performMulticastRequest:(int)requestType forGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr
32453268
{
32463269
__block BOOL result = NO;
32473270
__block NSError *err = nil;
@@ -3297,7 +3320,7 @@ - (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface e
32973320
imreq.imr_multiaddr = nativeGroup->sin_addr;
32983321
imreq.imr_interface = nativeIface->sin_addr;
32993322

3300-
int status = setsockopt(socket4FD, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&imreq, sizeof(imreq));
3323+
int status = setsockopt(socket4FD, IPPROTO_IP, requestType, (const void *)&imreq, sizeof(imreq));
33013324
if (status != 0)
33023325
{
33033326
err = [[self errnoErrorWithReason:@"Error in setsockopt() function"] retain];
@@ -3319,7 +3342,7 @@ - (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface e
33193342
imreq.ipv6mr_multiaddr = nativeGroup->sin6_addr;
33203343
imreq.ipv6mr_interface = [self indexOfInterfaceAddr6:interfaceAddr6];
33213344

3322-
int status = setsockopt(socket6FD, IPPROTO_IP, IPV6_JOIN_GROUP, (const void *)&imreq, sizeof(imreq));
3345+
int status = setsockopt(socket6FD, IPPROTO_IP, requestType, (const void *)&imreq, sizeof(imreq));
33233346
if (status != 0)
33243347
{
33253348
err = [[self errnoErrorWithReason:@"Error in setsockopt() function"] retain];
@@ -3798,7 +3821,7 @@ - (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout
37983821
dispatch_release(theSendTimer);
37993822
});
38003823

3801-
dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (timeout * NSEC_PER_SEC));
3824+
dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC));
38023825

38033826
dispatch_source_set_timer(sendTimer, tt, DISPATCH_TIME_FOREVER, 0);
38043827
dispatch_resume(sendTimer);
@@ -4006,12 +4029,12 @@ - (void)doReceive
40064029

40074030
if (result > 0)
40084031
{
4009-
if (result >= socket4FDBytesAvailable)
4032+
if ((size_t)result >= socket4FDBytesAvailable)
40104033
socket4FDBytesAvailable = 0;
40114034
else
40124035
socket4FDBytesAvailable -= result;
40134036

4014-
if (result != bufSize) {
4037+
if ((size_t)result != bufSize) {
40154038
buf = realloc(buf, result);
40164039
}
40174040

@@ -4040,12 +4063,12 @@ - (void)doReceive
40404063

40414064
if (result > 0)
40424065
{
4043-
if (result >= socket6FDBytesAvailable)
4066+
if ((size_t)result >= socket6FDBytesAvailable)
40444067
socket6FDBytesAvailable = 0;
40454068
else
40464069
socket6FDBytesAvailable -= result;
40474070

4048-
if (result != bufSize) {
4071+
if ((size_t)result != bufSize) {
40494072
buf = realloc(buf, result);
40504073
}
40514074

@@ -4220,6 +4243,9 @@ - (void)closeAfterSending
42204243

42214244
static NSThread *listenerThread;
42224245

4246+
+ (void)ignore:(id)_
4247+
{}
4248+
42234249
+ (void)startListenerThreadIfNeeded
42244250
{
42254251
static dispatch_once_t predicate;

0 commit comments

Comments
 (0)