2014-10-14 4 views
0

Я просто написал TCP-сервер, и он работал отлично в большинстве случаев. Но если я убью его вручную и немедленно его перезагружу, TCP-клиент иногда не мог подключиться к нему. Тогда, если я убью его и снова заново его заново, все будет хорошо. Я действительно хочу знать, почему, и я попытался изменить /proc/sys/net/ipv4/tcp_tw_recycle и /proc/sys/net/ipv4/tcp_tw_reuse. Но это не сработало.Почему TCP-клиент не может подключиться к серверу TCP иногда после перезапуска сервера TCP?

+0

Скорее всего, это ошибка на сервере, неправильное обращение случая, когда он не в состоянии открыть порт сразу же при запуске и не посещая SO_REUSEPORT. Но мы не можем отлаживать код, который мы не можем видеть. –

+0

Спасибо за внимание! –

ответ

0

Это действительно связано с тем, что розетки установлены для повторного использования.

Попробуйте инициализировать свой сокет таким образом:

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

+0

Спасибо, julumme! Это решило мою проблему. –

+0

Интересно, есть ли способ изменить конфигурацию системы и включить повторное использование по умолчанию. –

+0

У вашей системы также будут другие программы с сокетами, поэтому изменение некоторых глобальных настроек может иметь странные последствия для работы системы - я думаю, что лучше просто полностью контролировать свой собственный код. – julumme

 Смежные вопросы

  • Нет связанных вопросов^_^