LINUX.ORG.RU

[network programming] bind: address already in use


0

0

Давно уже использую опцию, чтобы избегать сабжа, но на одном старом ПК этот подход даёт сбой. Оказывается:

http://rootprompt.org/article.php3?article=9517

Т.е. close() в этом отношении работает асинхронно. Конечно, добавляя маленькую задержку, можно снова bind'овать сокет. А нет ли более менее простой возможности узнать, сколько точно нужно ждать? Или просто bind в цикле до 1000 попыток и будет самым простым?

★★★★★

В цикле while вставил небольшую задержку (1 мс) и всё ОК: макс. 4 вызова bind().

Но всё же, можно ли каким-то более изящным способом получить уведомление об отсоединении сокета?

gag ★★★★★
() автор топика

как вариант:

int socket, yes = 1;
socket = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
и т.д. по тексту

beastie ★★★★★
()
Ответ на: комментарий от gag

ещё вариант:

while (bind(socket, (struct sockaddr *)&sin, sizeof(sin)) == EINVAL)
        usleep(500000);

beastie ★★★★★
()

man shutdown, мб поможет. Не тролль.

Northsoft ★★
()
Ответ на: комментарий от true_admin

Вот и я был удивлён, что для SO_REUSEADDR существует вот такая оговорка.

С паузой «10 мкс» g_usleep(10) bind() вызывается макс. 5 раз. Но клиент после удачного коннекта иногда получает при чтении, что сервер закрыл соединение.

gag ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.