@JRubyMethod public IRubyObject setsockopt( ThreadContext context, IRubyObject lev, IRubyObject optname, IRubyObject val) { int level = RubyNumeric.fix2int(lev); int opt = RubyNumeric.fix2int(optname); try { switch (SocketLevel.valueOf(level)) { case SOL_IP: case SOL_SOCKET: case SOL_TCP: case SOL_UDP: switch (SocketOption.valueOf(opt)) { case SO_BROADCAST: setBroadcast(val); break; case SO_KEEPALIVE: setKeepAlive(val); break; case SO_LINGER: setLinger(val); break; case SO_OOBINLINE: setOOBInline(val); break; case SO_RCVBUF: setRcvBuf(val); break; case SO_REUSEADDR: setReuseAddr(val); break; case SO_SNDBUF: setSndBuf(val); break; case SO_RCVTIMEO: case SO_SNDTIMEO: setTimeout(val); break; // Can't support the rest with Java case SO_TYPE: case SO_RCVLOWAT: case SO_SNDLOWAT: case SO_DEBUG: case SO_ERROR: case SO_DONTROUTE: case SO_TIMESTAMP: break; default: if (IPPROTO_TCP.value() == level && TCP_NODELAY.value() == opt) { setTcpNoDelay(val); } else { throw context.getRuntime().newErrnoENOPROTOOPTError(); } } break; default: if (IPPROTO_TCP.value() == level && TCP_NODELAY.value() == opt) { setTcpNoDelay(val); } else { throw context.getRuntime().newErrnoENOPROTOOPTError(); } } } catch (IOException e) { throw context.getRuntime().newErrnoENOPROTOOPTError(); } return context.getRuntime().newFixnum(0); }