2015-05-13 4 views
1

Это работает для меня сейчас. Но тогда я должен убедиться, что повторно подключиться к клиенту начинается после того, как когда-нибудь скажут две минуты. По мере того как стартовый клиент снова занимает немного времени, и адрес, который уже используется, бросается. Но через минуту ему позволено связывать и слушать, чего не было. Это время 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 

Заранее спасибо

+2

проверить статус, возвращенный с чтения –

+0

не может читать 0, так как сервер ничего не публикует, так как новых данных нет? И что еще более важно, я хочу знать, почему серверу не разрешено связывать тот же порт снова, как никто его уже не слушает? – Invictus

+0

Когда первое соединение закрывается, сервер возвращается к вызову accept() в сокете, который он прослушивает, чтобы получить следующее входящее соединение? –

ответ

1

Похоже, вы немного запутался о том, как работает TCP. не

При прекращении и повторно запустить сервер, клиент больше не подключен, поэтому необходимо, чтобы закрыть его конец соединения TCP, т.е. называют close(2) на дескриптор сокета, а затем создать новый socket(2) и connect(2) его снова ,

Возможно, у вас отсутствует 0 (ноль), возвращенный с read(2) на клиентском сокете, что означает, что другой конец закрыл конец соединения.

+0

Я пробовал это.Но когда я закрываю сокет на стороне клиента после чтения = 0 'if (n == 0) { \t // ошибка (« ОШИБКА чтения из сокета »); \t close (sockfd); reconnect (argv [1], portno); \t} ' – Invictus

+0

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

+0

В мире TCP/IP обычно мы называем процессы, которые выполняют 'bind (2)', 'listen (2)', 'accept (2)' sequence a * ** server ***, и те, которые делают 'connect (2)' *** *** ***. У вас оба, поэтому вам нужно применять одинаковые правила для обеих сторон (например, установите SO_REUSEADDR в прослушивающих сокетах). –

0

. Когда я убиваю серверный процесс и пытаюсь запустить его снова, он говорит, что адрес уже используется. При использовании SO_REUSEADDR он позволяет повторно использовать порт, но клиент больше не получает данные с сервера.

У вас не может быть ваш клиент, как будто ничего не случилось с сервером. Клиент должен обнаружить неисправное соединение и закрыть сокет до конца и снова перезапустить процесс установления соединения. Старое соединение ушло навсегда.

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