Программирование сокетов Unix: порт не освобождается после отключения сервера - PullRequest
1 голос
/ 08 июля 2010

Я изучаю программирование сокетов Unix. Я создал сервер времени, который отправляет необработанные данные времени, и клиент для него, который получает эти данные и преобразует их в местное время.

Когда я запускаю сервер, подключаю к нему клиент (который заставляет их обоих выполнять свою работу и завершает работу), а затем повторно запускаю сервер, я получаю errno = 98 при вызове bind (). Я должен изменить порт в исходном коде сервера и перекомпилировать его, чтобы избавиться от этой ошибки. Когда я запускаю сервер и снова подключаюсь к нему, все в порядке, после повторного запуска ситуация повторяется. Но тогда я могу вернуться к предыдущему порту. Поэтому я прыгаю с порта 1025 на 1026 и наоборот при каждом запуске отладки (что очень часто, так что это немного раздражает).

Это работает следующим образом: сервер открывает сокет слушателя, привязывается к нему, прослушивает его, принимает соединение в сокет данных, записывает в него time_t, закрывает сокет данных и затем закрывает сокет слушателя. Клиент открывает сокет, подключается к серверу, считывает данные и закрывает сокет.

В чем проблема?

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

Ответы [ 4 ]

2 голосов
/ 08 июля 2010

Розетки имеют длительное время после закрытия. Они могут оставить порт в течение некоторого времени после выполнения вашего приложения, поэтому они могут отправлять любые неотправленные данные. Если вы подождете достаточно долго, порт будет освобожден и его можно будет снова использовать для другого сокета.

Для получения дополнительной информации о проверке Socket Lingering:

http://www.developerweb.net/forum/archive/index.php/t-2982.html

1 голос
/ 20 февраля 2012
1 голос
/ 08 июля 2010

errno 98 - Адрес уже используется

Просмотр SO_REUSEADDR

Руководство Биджа по сетевому программированию

1 голос
/ 08 июля 2010
...