@@ -3589,18 +3589,17 @@ - (void)doSend
3589
3589
return ;
3590
3590
}
3591
3591
3592
- ssize_t result = 0 ;
3592
+ NSData *addr = nil ;
3593
+ int af;
3594
+
3595
+ // 1. Check for problems
3593
3596
3594
3597
BOOL waitingForResolve = NO ;
3595
- BOOL waitingForSocket = NO ;
3596
- BOOL checkResult = NO ;
3597
3598
BOOL done = NO ;
3598
3599
3599
3600
if (flags & kDidConnect )
3600
3601
{
3601
- //
3602
3602
// Connected socket
3603
- //
3604
3603
3605
3604
if (currentSend->resolveInProgress || currentSend->addresses || currentSend->error )
3606
3605
{
@@ -3612,24 +3611,13 @@ - (void)doSend
3612
3611
}
3613
3612
else
3614
3613
{
3615
- const void *buffer = [currentSend->buffer bytes ];
3616
- size_t length = (size_t )[currentSend->buffer length ];
3617
-
3618
- if (socket4FD != SOCKET_NULL)
3619
- result = send (socket4FD, buffer, length, 0 );
3620
- else
3621
- result = send (socket6FD, buffer, length, 0 );
3622
-
3623
- LogVerbose (@" send(socket%@ FD) = %i (connected)" , (socket4FD != SOCKET_NULL ? @" 4" : @" 6" ), (int )result);
3624
-
3625
- checkResult = YES ;
3614
+ af = cachedConnectedFamily;
3615
+ addr = cachedConnectedAddress;
3626
3616
}
3627
3617
}
3628
3618
else
3629
3619
{
3630
- //
3631
3620
// Non-Connected socket
3632
- //
3633
3621
3634
3622
if (currentSend->resolveInProgress )
3635
3623
{
@@ -3651,40 +3639,58 @@ - (void)doSend
3651
3639
}
3652
3640
else
3653
3641
{
3654
- NSData *addr = nil ;
3655
3642
NSError *err = nil ;
3656
-
3657
- int af = [self getAddress: &addr error: &err fromAddresses: currentSend->addresses];
3643
+ af = [self getAddress: &addr error: &err fromAddresses: currentSend->addresses];
3658
3644
3659
3645
if (err)
3660
3646
{
3661
3647
[self notifyDidNotSendDataWithTag: currentSend->tag dueToError: err];
3662
3648
done = YES ;
3663
3649
}
3664
- else
3665
- {
3666
- const void *buffer = [currentSend->buffer bytes ];
3667
- size_t length = (size_t )[currentSend->buffer length ];
3668
-
3669
- const void *dst = [addr bytes ];
3670
- socklen_t dstSize = (socklen_t )[addr length ];
3671
-
3672
- if (af == AF_INET)
3673
- result = sendto (socket4FD, buffer, length, 0 , dst, dstSize);
3674
- else
3675
- result = sendto (socket6FD, buffer, length, 0 , dst, dstSize);
3676
-
3677
- LogVerbose (@" send(socket%@ FD) = %i (non-connected)" , (af == AF_INET ? @" 4" : @" 6" ), (int )result);
3678
-
3679
- checkResult = YES ;
3680
- }
3681
3650
}
3682
3651
}
3683
3652
3653
+ // 2. Perform the send (if no problems)
3654
+
3684
3655
NSError *error = nil ;
3656
+ BOOL waitingForSocket = NO ;
3685
3657
3686
- if (checkResult )
3658
+ if (!waitingForResolve && !done )
3687
3659
{
3660
+ ssize_t result = 0 ;
3661
+
3662
+ if (flags & kDidConnect )
3663
+ {
3664
+ // Connected socket
3665
+
3666
+ const void *buffer = [currentSend->buffer bytes ];
3667
+ size_t length = (size_t )[currentSend->buffer length ];
3668
+
3669
+ if (socket4FD != SOCKET_NULL)
3670
+ result = send (socket4FD, buffer, length, 0 );
3671
+ else
3672
+ result = send (socket6FD, buffer, length, 0 );
3673
+
3674
+ LogVerbose (@" send(socket%@ FD) = %i (connected)" , (socket4FD != SOCKET_NULL ? @" 4" : @" 6" ), (int )result);
3675
+ }
3676
+ else
3677
+ {
3678
+ // Non-Connected socket
3679
+
3680
+ const void *buffer = [currentSend->buffer bytes ];
3681
+ size_t length = (size_t )[currentSend->buffer length ];
3682
+
3683
+ const void *dst = [addr bytes ];
3684
+ socklen_t dstSize = (socklen_t )[addr length ];
3685
+
3686
+ if (af == AF_INET)
3687
+ result = sendto (socket4FD, buffer, length, 0 , dst, dstSize);
3688
+ else
3689
+ result = sendto (socket6FD, buffer, length, 0 , dst, dstSize);
3690
+
3691
+ LogVerbose (@" send(socket%@ FD) = %i (non-connected)" , (af == AF_INET ? @" 4" : @" 6" ), (int )result);
3692
+ }
3693
+
3688
3694
// If the socket wasn't bound before, it is now
3689
3695
3690
3696
if ((flags & kDidBind ) == 0 )
@@ -3717,6 +3723,8 @@ - (void)doSend
3717
3723
}
3718
3724
}
3719
3725
3726
+ // 3. Process results of 1 & 2
3727
+
3720
3728
if (waitingForResolve)
3721
3729
{
3722
3730
// We're waiting for the packet's destination to be resolved.
0 commit comments