Программируя в C, каждый устанавливает опции при использовании системного вызова вроде:
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;
В java
Способ C установить опции испытывает недостаток в безопасности типов объектно-ориентированного программирования. Опция, которую каждый хочет установить/получить, идентифицируется интервалом, и значение, чтобы установить/войти является непрозрачным void*. Слишком легко передать неправильный идентификатор опции, неправильный объект типа в void* параметре, или несправедливость для того параметра. Хуже все еще, код для этих ошибок будет обычно компилировать, и ошибка будет только проявлена во времени выполнения.
Java теперь обеспечивает безопасный с точки зрения типов способ установить опции. У каждого class сокета есть получить/установить метод для каждой опции, которую он поддерживает, беря и возвращая соответствующий тип., Поддерживаемые опции те, для который классы сокета и их значение вкратце:
TCP_NODELAY
Отключите алгоритм Нэйгла.
Допустимый для (клиента) Сокеты.
SO_LINGER
Определите, что тайм-аут "задерживается на завершении".
Допустимый для (клиента) Сокеты.
SO_TIMEOUT
Определите тайм-аут при блокировании операций сокета. (Не блокируйте навсегда!
Допустимый для всех сокетов: Сокет, ServerSocket, DatagramSocket.
SO_BINDADDR
Выберите локальную привязку по адресу сокета.
Допустимый для Сокета, ServerSocket, DatagramSocket.
SO_REUSEADDR
Включите адресу повторного использования для сокета.
Допустимый для Сокета, ServerSocket, DatagramSocket.
SO_BROADCAST
Позволяет сокету отправить широковещательные сообщения.
Допустимый для DatagramSocket.
SO_SNDBUF
Установите подсказку размер базовых буферов для исходящего сетевого ввода-вывода.
Допустимый для всех сокетов: Сокет, ServerSocket, DatagramSocket.
SO_RCVBUF
Получите размер буфера, фактически используемого платформой, получая в данных на этом сокете.
Допустимый для всех сокетов: Сокет, ServerSocket, DatagramSocket.
SO_KEEPALIVE
Включите сокет keepalive.
Допустимый для Сокета.
SO_OOBINLINE
Включите встроенному приему TCP срочные данные.
Допустимый для Сокета.
IP_MULTICAST_IF
Определите исходящий интерфейс для многоадресных пакетов (на многосетевых узлах).
Допустимый для MulticastSockets.
IP_MULTICAST_LOOP
Включает или отключает локальную обратную петлю многоадресных дейтаграмм.
Допустимый для MulticastSocket.
IP_TOS
Устанавливает тип службы или поле class трафика в заголовке IP для сокета UDP или TCP.
Допустимый для Сокета, DatagramSocket
Оказался нереален...
Некоторые возможные опции BSD, которые не поддерживаются в java:
СОКЕТЫ СЫРЫХ ДАННЫХ/ICMP: Основным параметром в пользу этого, казалось, были так люди, мог записать "ping" в java. Кошмар безопасности. Должен быть корень на машинах UNIX.
Реализация детализирует...
... то, что Вы не должны знать, если Вы не разделяете SocketImpl/DatagramSocketImpl на подклассы. У каждого объекта *Socket есть базовый SocketImpl/DatagramSocketImpl, который взаимодействует через интерфейс к собственному коду. Классы Impl реализуют два метода, чтобы поддерживать опции:
это очень напоминает C. Эти методы действуют как связующее звено к собственным методам, и гарантируют безопасность типов прежде, чем собственные методы будут вызваны.