| 213 | } |
| 214 | |
| 215 | void TNonblockingServerSocket::_setup_sockopts() { |
| 216 | int one = 1; |
| 217 | if (!isUnixDomainSocket()) { |
| 218 | // Set THRIFT_NO_SOCKET_CACHING to prevent 2MSL delay on accept. |
| 219 | // This does not work with Domain sockets on most platforms. And |
| 220 | // on Windows it completely breaks the socket. Therefore do not |
| 221 | // use this on Domain sockets. |
| 222 | if (-1 == setsockopt(serverSocket_, |
| 223 | SOL_SOCKET, |
| 224 | THRIFT_NO_SOCKET_CACHING, |
| 225 | cast_sockopt(&one), |
| 226 | sizeof(one))) { |
| 227 | // NOTE: SO_EXCLUSIVEADDRUSE socket option can only be used by members |
| 228 | // of the Administrators security group on Windows XP and earlier. But |
| 229 | // we do not target WinXP anymore so no special checks required. |
| 230 | int errno_copy = THRIFT_GET_SOCKET_ERROR; |
| 231 | TOutput::instance().perror("TNonblockingServerSocket::listen() setsockopt() THRIFT_NO_SOCKET_CACHING ", |
| 232 | errno_copy); |
| 233 | close(); |
| 234 | throw TTransportException(TTransportException::NOT_OPEN, |
| 235 | "Could not set THRIFT_NO_SOCKET_CACHING", |
| 236 | errno_copy); |
| 237 | } |
| 238 | } |
| 239 | |
| 240 | // Set TCP buffer sizes |
| 241 | if (tcpSendBuffer_ > 0) { |
| 242 | if (-1 == setsockopt(serverSocket_, |
| 243 | SOL_SOCKET, |
| 244 | SO_SNDBUF, |
| 245 | cast_sockopt(&tcpSendBuffer_), |
| 246 | sizeof(tcpSendBuffer_))) { |
| 247 | int errno_copy = THRIFT_GET_SOCKET_ERROR; |
| 248 | TOutput::instance().perror("TNonblockingServerSocket::listen() setsockopt() SO_SNDBUF ", errno_copy); |
| 249 | close(); |
| 250 | throw TTransportException(TTransportException::NOT_OPEN, |
| 251 | "Could not set SO_SNDBUF", |
| 252 | errno_copy); |
| 253 | } |
| 254 | } |
| 255 | |
| 256 | if (tcpRecvBuffer_ > 0) { |
| 257 | if (-1 == setsockopt(serverSocket_, |
| 258 | SOL_SOCKET, |
| 259 | SO_RCVBUF, |
| 260 | cast_sockopt(&tcpRecvBuffer_), |
| 261 | sizeof(tcpRecvBuffer_))) { |
| 262 | int errno_copy = THRIFT_GET_SOCKET_ERROR; |
| 263 | TOutput::instance().perror("TNonblockingServerSocket::listen() setsockopt() SO_RCVBUF ", errno_copy); |
| 264 | close(); |
| 265 | throw TTransportException(TTransportException::NOT_OPEN, |
| 266 | "Could not set SO_RCVBUF", |
| 267 | errno_copy); |
| 268 | } |
| 269 | } |
| 270 | |
| 271 | // Turn linger off, don't want to block on calls to close |
| 272 | struct linger ling = {0, 0}; |
nothing calls this directly
no test coverage detected