Socket Options in Java

The C way

Programming in C, one sets options by using a system call along the lines of:
    setsockopt(int fd, int level, int optval, void *optdata, 
           int optdatalen);

    fd = already opened (possibly connected) socket fd;
    level = level in the protocol stack (IP, UDP, TCP) where
            the option applies;
    optval = the option, a CONSTANT;
    optdata = ptr to option dependent struct of parameters relevant
             only to a particular option;

In java

The C way of setting options lacks the type-safety of object-oriented programming. The option one wishes to set/get is identified by an int, and the value to set/get into is an opaque void*. It is all too easy to pass the wrong option identifier, the wrong type object in the void* parameter, or the wrong for that parameter. Worse still, the code for these errors will typically compile, and the error will only be manifested at runtime.

Java now provides a type-safe way to set options. Each socket class has a get/set method for each option it supports, taking and returning the appropriate type. The options supported, for which socket classes and their meaning in brief:

Fell by the wayside...

Some possible BSD options that are not supported in java:

The implementation details...

...that you don't need to know, unless you subclass SocketImpl/DatagramSocketImpl. Every *Socket object has an underlying SocketImpl/DatagramSocketImpl that interfaces to native code. The Impl classes implement two methods to support options:
    void setOption(int optID, Object val) throws SocketException;
    Object getOption(int optID) throws SocketException;
that look much like C. These methods act as glue to the native methods, and ensure type safety before native methods are invoked.