Я просто написал TCP-сервер, и он работал отлично в большинстве случаев. Но если я убью его вручную и немедленно его перезагружу, TCP-клиент иногда не мог подключиться к нему. Тогда, если я убью его и снова заново его заново, все будет хорошо. Я действительно хочу знать, почему, и я попытался изменить /proc/sys/net/ipv4/tcp_tw_recycle
и /proc/sys/net/ipv4/tcp_tw_reuse
. Но это не сработало.Почему TCP-клиент не может подключиться к серверу TCP иногда после перезапуска сервера TCP?
ответ
Это действительно связано с тем, что розетки установлены для повторного использования.
Попробуйте инициализировать свой сокет таким образом:
int reuse_addr = 1;
int listener_socket = 0;
listener_socket = socket(AF_INET, SOCK_STREAM, 0); //get socket handle
if (listener_socket < 0)
{
//Handle error
}
//Set the socket reusable
setsockopt(listener_socket, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(int));
Переменная reuse_addr
является 1
, чтобы определить, что мы хотим включить конкретный вариант (0
отключит).
Ключевое слово SOL_SOCKET
означает, что вы хотите установить параметр/параметр уровня сокета, он будет независимым от протокола. Мы установили SO_REUSEADDR
, вы можете прочитать об этом здесь: http://www.unixguide.net/network/socketfaq/4.5.shtml
Других доступных настройках, вы можете проверить здесь: http://www.delorie.com/gnu/docs/glibc/libc_352.html
Спасибо, julumme! Это решило мою проблему. –
Интересно, есть ли способ изменить конфигурацию системы и включить повторное использование по умолчанию. –
У вашей системы также будут другие программы с сокетами, поэтому изменение некоторых глобальных настроек может иметь странные последствия для работы системы - я думаю, что лучше просто полностью контролировать свой собственный код. – julumme
Скорее всего, это ошибка на сервере, неправильное обращение случая, когда он не в состоянии открыть порт сразу же при запуске и не посещая SO_REUSEPORT. Но мы не можем отлаживать код, который мы не можем видеть. –
Спасибо за внимание! –