The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Адрес (сокета) уже используется"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Адрес (сокета) уже используется"  
Сообщение от pvr (ok) on 29-Май-07, 13:01 
Здравствуйте!

Вот выдержки из серверного приложения:

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (bind(sockfd, (struct sockaddr *)&self, sizeof(self)) != 0)
        exit(errno);
    if (listen(sockfd, 20) != 0 )
        exit(errno);

    for (;;)
    {
        fd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
        if (fd == -1)
            break;
        // Do something
        close(fd);
    }
}

Когда мне нужно завершить приложение, то я закрываю дескриптор sockfd из другого треда (pthread):

    close(sockfd);

При этом приведенный выше бесконечный цикл завершается, после чего завершается и вся программа.

Проблема в том, что, когда я запускаю ее вновь, то функция bind(3) генерирует ошибку 98 - Address already in use. Спустя некоторое время, порядка минуты, функция bind(3) выполняется нормально.

Как мне корректно завершить работу с sockfd, чтобы избежать описанного эффекта?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Адрес (сокета) уже используется"  
Сообщение от NuINu (??) on 29-Май-07, 14:50 
>Здравствуйте!
>
>Вот выдержки из серверного приложения:
>
>При этом приведенный выше бесконечный цикл завершается, после чего завершается и вся
>программа.
>
>Проблема в том, что, когда я запускаю ее вновь, то функция bind(3)
>генерирует ошибку 98 - Address already in use. Спустя некоторое время,
>порядка минуты, функция bind(3) выполняется нормально.
>
>Как мне корректно завершить работу с sockfd, чтобы избежать описанного эффекта?

Корректнее завершить нельзя, можно корректнее начать!
Тут ребята приводили как, но я блин забыл, но у меня был пакет исходников от mysql
вот что я там нашел:
        int listen_sd;
        listen_sd = socket (AF_INET, SOCK_STREAM, 0);
        setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(&reuseaddr));
        err = bind(listen_sd, (struct sockaddr*) &sa_serv,
        err = listen (listen_sd, 5);
        th_args.sd = accept (listen_sd, (struct sockaddr*) &sa_cli, &client_len);
        close (listen_sd);
обрати внимение на SO_REUSEADDR

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Адрес (сокета) уже используется"  
Сообщение от pvr (ok) on 30-Май-07, 11:41 
>Корректнее завершить нельзя, можно корректнее начать!
>обрати внимение на SO_REUSEADDR

Понял. Спасибо!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру