Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions Source/lib/SocketRocket/SRWebSocket.m
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@
#error SocketRocket must be compiled with ARC enabled
#endif

#include <netinet/tcp.h> // for TCP_NODELAY
#import <arpa/inet.h> // for IPPROTO_TCP


typedef enum {
SROpCodeTextFrame = 0x1,
Expand Down Expand Up @@ -575,6 +578,39 @@ - (void)_initializeStreams;
_outputStream.delegate = self;
}

- (void)disableNaglesAlgorithmForStream:(NSStream *)stream {

CFDataRef socketData = NULL;

// Get socket data
if ([stream isKindOfClass:[NSOutputStream class]]) {
socketData = CFWriteStreamCopyProperty((__bridge CFWriteStreamRef)((NSOutputStream *)stream), kCFStreamPropertySocketNativeHandle);
} else if ([stream isKindOfClass:[NSInputStream class]]) {
socketData = CFReadStreamCopyProperty((__bridge CFReadStreamRef)((NSInputStream *)stream), kCFStreamPropertySocketNativeHandle);
}


// get a handle to the native socket
CFSocketNativeHandle *rawsock = (CFSocketNativeHandle *)CFDataGetBytePtr(socketData);
// Disable Nagle's algorythm
static const int kOne = 1;
int err = setsockopt(*rawsock, IPPROTO_TCP, TCP_NODELAY, &kOne, sizeof(kOne));
if (socketData) {
CFRelease(socketData);
}


// Debug info
BOOL isInput = [stream isKindOfClass:[NSInputStream class]];
NSString * streamType = isInput ? @"INPUT" : @"OUTPUT";
if (err < 0) {
NSLog(@"Could Not Disable Nagle for %@ stream", streamType);
} else {
NSLog(@"Nagle Is Disabled for %@ stream", streamType);
}
}


- (void)openConnection;
{
if (!_scheduledRunloops.count) {
Expand Down Expand Up @@ -1412,6 +1448,9 @@ - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode;
switch (eventCode) {
case NSStreamEventOpenCompleted: {
SRFastLog(@"NSStreamEventOpenCompleted %@", aStream);

[self disableNaglesAlgorithmForStream:aStream];

if (self.readyState >= SR_CLOSING) {
return;
}
Expand Down