@@ -36,10 +36,11 @@ #import "OFAcceptFailedException.h" #import "OFAlreadyConnectedException.h" #import "OFBindFailedException.h" #import "OFConnectionFailedException.h" +#import "OFGetOptionFailedException.h" #import "OFInvalidArgumentException.h" #import "OFListenFailedException.h" #import "OFNotConnectedException.h" #import "OFNotImplementedException.h" #import "OFOutOfMemoryException.h" @@ -560,21 +561,10 @@ [OFRunLoop OF_addAsyncAcceptForTCPSocket: self block: block]; } #endif -- (void)setKeepAlivesEnabled: (bool)enable -{ - int v = enable; - - if (setsockopt(_socket, SOL_SOCKET, SO_KEEPALIVE, - (char*)&v, (socklen_t)sizeof(v))) - @throw [OFSetOptionFailedException - exceptionWithStream: self - errNo: of_socket_errno()]; -} - - (OFString*)remoteAddress { OFString *ret; if (_socket == INVALID_SOCKET) @@ -590,6 +580,56 @@ - (bool)isListening { return _listening; } + +- (void)setKeepAliveEnabled: (bool)enabled +{ + int v = enabled; + + if (setsockopt(_socket, SOL_SOCKET, SO_KEEPALIVE, + (char*)&v, (socklen_t)sizeof(v)) != 0) + @throw [OFSetOptionFailedException + exceptionWithStream: self + errNo: of_socket_errno()]; +} + +- (bool)isKeepAliveEnabled +{ + int v; + socklen_t len = sizeof(v); + + if (getsockopt(_socket, SOL_SOCKET, SO_KEEPALIVE, + (char*)&v, &len) != 0 || len != sizeof(v)) + @throw [OFGetOptionFailedException + exceptionWithStream: self + errNo: of_socket_errno()]; + + return v; +} + +- (void)setTCPNoDelayEnabled: (bool)enabled +{ + int v = enabled; + + if (setsockopt(_socket, IPPROTO_TCP, TCP_NODELAY, + (char*)&v, (socklen_t)sizeof(v)) != 0) + @throw [OFSetOptionFailedException + exceptionWithStream: self + errNo: of_socket_errno()]; +} + +- (bool)isTCPNoDelayEnabled +{ + int v; + socklen_t len = sizeof(v); + + if (getsockopt(_socket, IPPROTO_TCP, TCP_NODELAY, + (char*)&v, &len) != 0 || len != sizeof(v)) + @throw [OFGetOptionFailedException + exceptionWithStream: self + errNo: of_socket_errno()]; + + return v; +} @end