The OpenNET Project / Index page

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

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

"Программа иногда вылетает, непойму в чём ошибся"  
Сообщение от zkrvova email(ok) on 10-Май-07, 12:42 
Есть прога которая слушает порт и при запросе на соединение создаёт свою копию и запускает процедуру работы с клиентом. Ну вообщем стандартный демон с fork.

работает номально но иногда вылетает порт остаётся занятым. т.е. даже её перезапустить нельзя выдаёт bind error. Только перезапуск сервера помогает.

хочется знать:
1. Что в коде неправильного что прога вылетает?
2. А как можно освободить порт для bind?

Вот исходник:
int main(){

    pid_t pid;
    

    openlog("stargate",LOG_PID,LOG_USER);    //otkruli soedinenie s logerom

    syslog(LOG_INFO,"Start stargate");    //proizohel start

    read_init();

server();
}


server(){

    pid_t pid_;
    int sid, newsid;
    size_t sin_size = sizeof(struct sockaddr_in);

    sid=socket(AF_INET, SOCK_STREAM, 0); //sozdaem soket

    if(sid==-1){
        syslog(LOG_ERR,"Socket create error");
        closelog();
        exit(1);
    }

    bzero(&(localAddr), sizeof(localAddr));        //obnulyaem strukturu
    localAddr.sin_family=AF_INET;            //rabotaem s tcp/ip
    localAddr.sin_port=htons(SERVER_PORT);        //po portu "SERVER_PORT"
    localAddr.sin_addr.s_addr=INADDR_ANY;        //na lubom ip adrese

    if(bind(sid, (struct sockaddr *)&localAddr, sin_size)==-1){
        syslog(LOG_ERR,"Bind error");
        closelog();
        exit(1);
    }

    if(listen(sid, 5)==-1){                //sluhaem interfeys, ochered - 5 zaprosov
        syslog(LOG_ERR,"Listen error");
        closelog();
        exit(1);
    }

    while(1){

        while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 )
            ;
        newsid=accept(sid, (struct sockaddr *)&remoteAddr, &sin_size);         //ystanovleno novoe soedinenie

        if(newsid==-1){
            syslog(LOG_ERR,"Accept error");
            closelog();
            exit(1);
        }
    
        if (!fork()){            //sozdaem novuy eksemplyar dla obrabotki novogo soedineniya
            syslog(LOG_INFO,"Got a connection from %s",inet_ntoa(remoteAddr.sin_addr));
            close(sid);        //zakruvaem roditelskiy soket
            
            talker(newsid, remoteAddr);        //perehodim v glavnuy programu kotoraya buded obchatsys s abonentom

            close(newsid);
            syslog(LOG_INFO,"Close connection from %s",inet_ntoa(remoteAddr.sin_addr));
            closelog();
            exit(0);
        }
    }
}

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

 Оглавление

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


1. "Программа иногда вылетает, непойму в чём ошибся"  
Сообщение от vic (??) on 10-Май-07, 13:32 
>хочется знать:
>1. Что в коде неправильного что прога вылетает?
а) if (!fork()) {
неверно, надо так:
pid_t pid = fork();
if (pid == -1) { // ошибка форка, выход нафик }
else if (pid) // папик
{
}
else // сынок
{
}

б) вылетает скорее в talker(), код не представлен.
в) pid_ - подчерк в конце - не надо так юзать названия переменных :)
г) перед exit(), все таки, во всех случаях закрываем все открытые нами порты.
д) while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 ) ; // расшифруйте :)

>2. А как можно освободить порт для bind?
setsockopt() с параметром SO_REUSEADDR перед bind() поможет.

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

3. "Программа иногда вылетает, непойму в чём ошибся"  
Сообщение от zkrvova email(ok) on 11-Май-07, 10:14 
>>хочется знать:
>>1. Что в коде неправильного что прога вылетает?
>а) if (!fork()) {
>неверно, надо так:
>pid_t pid = fork();
>if (pid == -1) { // ошибка форка, выход нафик }
>else if (pid) // папик
>{
>}
>else // сынок
>{
>}
>
>б) вылетает скорее в talker(), код не представлен.
talker работает только в дочерних процессах и я не думаю, что из-за него может вылетать родительский.
>в) pid_ - подчерк в конце - не надо так юзать названия
>переменных :)
А чего? компилятор то прохавал и в адрес превратил.
>г) перед exit(), все таки, во всех случаях закрываем все открытые нами
>порты.
так я ни какие больше не открываю.
>д) while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 ) ; // расшифруйте :)
это я очищаю таблицу от уже зкрытых дочерних процессов (которые уже стали зомби)
>
>>2. А как можно освободить порт для bind?
>setsockopt() с параметром SO_REUSEADDR перед bind() поможет.
Спасибо, попробую.

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

2. "Программа иногда вылетает, непойму в чём ошибся"  
Сообщение от NuINu (??) on 10-Май-07, 13:34 
>Есть прога которая слушает порт и при запросе на соединение создаёт свою
>копию и запускает процедуру работы с клиентом. Ну вообщем стандартный демон
>с fork.
>
>работает номально но иногда вылетает порт остаётся занятым. т.е. даже её перезапустить
>нельзя выдаёт bind error. Только перезапуск сервера помогает.
>
>хочется знать:
>1. Что в коде неправильного что прога вылетает?
>2. А как можно освободить порт для bind?
2 надой найти тот процесс который висит и блокирует порт.
1. Вы не правильно обрабатываете сигналы.

используйте.
signal(sig_id, child_killed_handler)
для установки обработчика.

child_killed_handler(sig_num){
  while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 ) ;
}


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

4. "Программа иногда вылетает, непойму в чём ошибся"  
Сообщение от zkrvova email(ok) on 11-Май-07, 10:15 
>>Есть прога которая слушает порт и при запросе на соединение создаёт свою
>>копию и запускает процедуру работы с клиентом. Ну вообщем стандартный демон
>>с fork.
>>
>>работает номально но иногда вылетает порт остаётся занятым. т.е. даже её перезапустить
>>нельзя выдаёт bind error. Только перезапуск сервера помогает.
>>
>>хочется знать:
>>1. Что в коде неправильного что прога вылетает?
>>2. А как можно освободить порт для bind?
>2 надой найти тот процесс который висит и блокирует порт.
>1. Вы не правильно обрабатываете сигналы.
>
>используйте.
>signal(sig_id, child_killed_handler)
>для установки обработчика.
>
>child_killed_handler(sig_num){
>  while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 ) ;
>}
А не подскажите что писать вместо sig_id?
Я то вообще кажется сигналы не обрабатываю.


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

5. "Программа иногда вылетает, непойму в чём ошибся"  
Сообщение от NuINu (??) on 11-Май-07, 11:02 
>>>Есть прога которая слушает порт и при запросе на соединение создаёт свою
>>>копию и запускает процедуру работы с клиентом. Ну вообщем стандартный демон
>>>с fork.
>>>
>>>работает номально но иногда вылетает порт остаётся занятым. т.е. даже её перезапустить
>>>нельзя выдаёт bind error. Только перезапуск сервера помогает.
>>>
>>>хочется знать:
>>>1. Что в коде неправильного что прога вылетает?
>>>2. А как можно освободить порт для bind?
>>2 надой найти тот процесс который висит и блокирует порт.
>>1. Вы не правильно обрабатываете сигналы.
>>
>>используйте.
>>signal(sig_id, child_killed_handler)
>>для установки обработчика.
>>
>>child_killed_handler(sig_num){
>>  while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 ) ;
>>}
>А не подскажите что писать вместо sig_id?
>Я то вообще кажется сигналы не обрабатываю.
обрабатываешь, в каждом цикле у тебя цикл обработки его нужно исключить.

SIGCHLD

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

6. "Программа иногда вылетает, непойму в чём ошибся"  
Сообщение от zkrvova email(ok) on 11-Май-07, 11:50 
>>>>Есть прога которая слушает порт и при запросе на соединение создаёт свою
>>>>копию и запускает процедуру работы с клиентом. Ну вообщем стандартный демон
>>>>с fork.
>>>>
>>>>работает номально но иногда вылетает порт остаётся занятым. т.е. даже её перезапустить
>>>>нельзя выдаёт bind error. Только перезапуск сервера помогает.
>>>>
>>>>хочется знать:
>>>>1. Что в коде неправильного что прога вылетает?
>>>>2. А как можно освободить порт для bind?
>>>2 надой найти тот процесс который висит и блокирует порт.
>>>1. Вы не правильно обрабатываете сигналы.
>>>
>>>используйте.
>>>signal(sig_id, child_killed_handler)
>>>для установки обработчика.
>>>
>>>child_killed_handler(sig_num){
>>>  while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 ) ;
>>>}
>>А не подскажите что писать вместо sig_id?
>>Я то вообще кажется сигналы не обрабатываю.
>обрабатываешь, в каждом цикле у тебя цикл обработки его нужно исключить.
>
>SIGCHLD


Понятно, спасибо.

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

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

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




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

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