Скажем, я принял () соединение с моим сервером (который работает на Solaris), и клиент закрыл соединение. Каково состояние сокета (в категориях netstat) сокета на стороне сервера, прежде чем я закрою () его на стороне сервера? Это ОБЯЗАТЕЛЬНО?
Это будет CLOSE_WAIT, см. Диаграмму состояния tcp, например на http://en.wikipedia.org/wiki/File:Tcp_state_diagram_new.svg
В этом случае сокет на клиенте будет в TIME_WAIT, а сокет на сервере будет проходить через CLOSE_WAIT и довольно быстро перейдет в CLOSED, так что вы можете не поймать его в netstat, пока он полностью не исчезнет из списка.
CLOSE_WAIT
Вы можете проверить по:
ps auxf
lsof -a -p [server_process_id]
вы получите: носок 0,8
состояние 8: TCP_CLOSE
Это должно быть CLOSE_WAIT, так как конец, который начинает FIN, переходит к TIME_WAIT ---> CLOSED первым.
FIN
TIME_WAIT
CLOSED
В этом клиент инициирует первым. Таким образом, сервер перейдет на CLOSE_WAIT.
Полагаю, TIME_WAIT.
Вы можете проверить это с помощью "netstat" в Linux, не знаю, как это сделать в Solaris.