Это работает для меня сейчас. Но тогда я должен убедиться, что повторно подключиться к клиенту начинается после того, как когда-нибудь скажут две минуты. По мере того как стартовый клиент снова занимает немного времени, и адрес, который уже используется, бросается. Но через минуту ему позволено связывать и слушать, чего не было. Это время TTL мне нужно подождать?Серверный сокет Программирование TCP-соединения Адрес уже используется
Я написал программу сокетов сервера, в которой у меня есть сервер и клиент, работающие на одном хосте. Сервер только пишет (нет операции чтения сервером), пока клиент только читает с сервера (без записи, сделанной клиентом). Когда я убиваю серверный процесс и пытаюсь запустить его снова, он говорит, что адрес уже используется. При использовании SO_REUSEADDR он позволяет повторно использовать порт, но клиент больше не получает данные с сервера. Часть кода сервера
while(1)
{
write(newsockfd,"I got your message",18); //Server Publishes data all day
}
часть кода клиента: -
while(1)
{
n = read(sockfd,buffer,255);//Read all server publishes and store them
if (n == 0)
error("ERROR reading from socket");
printf("Here is the message: %s \n",buffer);
bzero(buffer,256); //Buffer set to Null again
}
Если на связи Стараюсь NETSTAT -a я могу видеть мой сервер прослушивает порт сказать, 20001, к которому я связать его. Но я не могу видеть соединение, даже когда работает клиентский сервер. Клиент сохраняет данные печати, полученные с сервера . Когда я убиваю серверный процесс, я вижу, что клиент просто печатает новую строку, когда буфер устанавливается в NULL после каждого чтения. Теперь мой вопрос: если соединение уже установлено, которое теперь завершено, это предотвращает прослушивание сервера на одном и том же порту? Мой главный вопрос. Если да, то почему другой процесс не прослушивает этот порт? SO_REUSEADDR позволяет серверу связывать и разрешать ADDR. Это потому, что сервер и клиент работают на одном хосте? Как обращаться в случае, если прекращение является необоснованным (вторичный вопрос). После добавления проверки чтения, как в комментариях, я все еще вижу клиента работает и NetStat дает мне ниже выход: -
[email protected]:~$ netstat -a | grep -i 2001
tcp 0 0 localhost:47058 localhost:2001 CLOSE_WAIT
tcp 0 0 localhost:2001 localhost:47058 FIN_WAIT2
Заранее спасибо
проверить статус, возвращенный с чтения –
не может читать 0, так как сервер ничего не публикует, так как новых данных нет? И что еще более важно, я хочу знать, почему серверу не разрешено связывать тот же порт снова, как никто его уже не слушает? – Invictus
Когда первое соединение закрывается, сервер возвращается к вызову accept() в сокете, который он прослушивает, чтобы получить следующее входящее соединение? –