После закрытия клиентского сокета на стороне сервера и выхода из приложения сокет все еще открыт в течение некоторого времени.Сокет открыт после процесса, который открыл его завершение
я могу видеть его с помощью NETSTAT
Every 0.1s: netstat -tuplna | grep 6676
tcp 0 0 127.0.0.1:6676 127.0.0.1:36065 TIME_WAIT -
Я использую log4cxx протоколирования и телнет Appender. log4cxx использует apr сокеты. метод Socket :: близко() выглядит следующим образом:
void Socket::close() {
if (socket != 0) {
apr_status_t status = apr_socket_close(socket);
if (status != APR_SUCCESS) {
throw SocketException(status);
}
socket = 0;
}
}
И это успешно. Но после завершения программы я вижу открытый сокет через netstat, и если он снова запустится, log4cxx не сможет открыть порт 6676, потому что он занят. Я пытаюсь изменить log4cxx. Shutdown гнездо до того близко:
void Socket::close() {
if (socket != 0) {
apr_status_t shutdown_status = apr_socket_shutdown(socket, APR_SHUTDOWN_READWRITE);
printf("Socket::close shutdown_status %d\n", shutdown_status);
if (shutdown_status != APR_SUCCESS) {
printf("Socket::close WTF %d\n", shutdown_status != APR_SUCCESS);
throw SocketException(shutdown_status);
}
apr_status_t close_status = apr_socket_close(socket);
printf("Socket::close close_status %d\n", close_status);
if (close_status != APR_SUCCESS) {
printf("Socket::close WTF %d\n", close_status != APR_SUCCESS);
throw SocketException(close_status);
}
socket = 0;
}
}
Но это не помогло, ошибка все еще воспроизводится.