@@ -204,6 +204,8 @@ - (void)doReceiveEOF;
204
204
205
205
- (void )closeWithError : (NSError *)error ;
206
206
207
+ - (BOOL )performMulticastRequest : (int )requestType forGroup : (NSString *)group onInterface : (NSString *)interface error : (NSError **)errPtr ;
208
+
207
209
#if TARGET_OS_IPHONE
208
210
- (BOOL )createReadAndWriteStreams : (NSError **)errPtr ;
209
211
- (BOOL )registerForStreamCallbacks : (NSError **)errPtr ;
@@ -218,6 +220,9 @@ + (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6;
218
220
+ (uint16_t )portFromSockaddr4 : (const struct sockaddr_in *)pSockaddr4 ;
219
221
+ (uint16_t )portFromSockaddr6 : (const struct sockaddr_in6 *)pSockaddr6 ;
220
222
223
+ // Forward declaration
224
+ + (void )listenerThread ;
225
+
221
226
@end
222
227
223
228
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -3242,6 +3247,24 @@ - (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr
3242
3247
}
3243
3248
3244
3249
- (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
3245
3268
{
3246
3269
__block BOOL result = NO ;
3247
3270
__block NSError *err = nil ;
@@ -3297,7 +3320,7 @@ - (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface e
3297
3320
imreq.imr_multiaddr = nativeGroup->sin_addr ;
3298
3321
imreq.imr_interface = nativeIface->sin_addr ;
3299
3322
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));
3301
3324
if (status != 0 )
3302
3325
{
3303
3326
err = [[self errnoErrorWithReason: @" Error in setsockopt() function" ] retain ];
@@ -3319,7 +3342,7 @@ - (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface e
3319
3342
imreq.ipv6mr_multiaddr = nativeGroup->sin6_addr ;
3320
3343
imreq.ipv6mr_interface = [self indexOfInterfaceAddr6: interfaceAddr6];
3321
3344
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));
3323
3346
if (status != 0 )
3324
3347
{
3325
3348
err = [[self errnoErrorWithReason: @" Error in setsockopt() function" ] retain ];
@@ -3798,7 +3821,7 @@ - (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout
3798
3821
dispatch_release (theSendTimer);
3799
3822
});
3800
3823
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));
3802
3825
3803
3826
dispatch_source_set_timer (sendTimer, tt, DISPATCH_TIME_FOREVER, 0 );
3804
3827
dispatch_resume (sendTimer);
@@ -4006,12 +4029,12 @@ - (void)doReceive
4006
4029
4007
4030
if (result > 0 )
4008
4031
{
4009
- if (result >= socket4FDBytesAvailable)
4032
+ if (( size_t ) result >= socket4FDBytesAvailable)
4010
4033
socket4FDBytesAvailable = 0 ;
4011
4034
else
4012
4035
socket4FDBytesAvailable -= result;
4013
4036
4014
- if (result != bufSize) {
4037
+ if (( size_t ) result != bufSize) {
4015
4038
buf = realloc (buf, result);
4016
4039
}
4017
4040
@@ -4040,12 +4063,12 @@ - (void)doReceive
4040
4063
4041
4064
if (result > 0 )
4042
4065
{
4043
- if (result >= socket6FDBytesAvailable)
4066
+ if (( size_t ) result >= socket6FDBytesAvailable)
4044
4067
socket6FDBytesAvailable = 0 ;
4045
4068
else
4046
4069
socket6FDBytesAvailable -= result;
4047
4070
4048
- if (result != bufSize) {
4071
+ if (( size_t ) result != bufSize) {
4049
4072
buf = realloc (buf, result);
4050
4073
}
4051
4074
@@ -4220,6 +4243,9 @@ - (void)closeAfterSending
4220
4243
4221
4244
static NSThread *listenerThread;
4222
4245
4246
+ + (void )ignore : (id )_
4247
+ {}
4248
+
4223
4249
+ (void )startListenerThreadIfNeeded
4224
4250
{
4225
4251
static dispatch_once_t predicate;
0 commit comments