Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GDB и SO_RCVTIMEO 
:(
    Опции темы
Anton Vatchenko
Дата 17.7.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: -1
Всего: -1



Итак. У меня Федора 5. Есть приложение с прослушиванием сокетов. Запускал раньше напрямую без отладки - все было без проблем. Запускаю gdb, делаю run. Делаю telnet куда надо - все ок. Делаю в другом окне еще telnet - вдруг в том месте, где ведется чтение (count = read(sck, buffer + offset, length - offset);) я получаю -1 - считается что соединение оборвалось. При чем это я получаю от двух соединений сразу. Методом исключения пришел к заключению. Если закомментировать следующее, то все работает.
        struct timeval tv;
        tv.tv_sec = 300;
        tv.tv_usec = 0;
        setsockopt(sck2, SOL_SOCKET, SO_RCVTIMEO, (struct timeval*) &tv, sizeof(struct timeval));

Почему так странно работает GDB, и как это исправить?


--------------------
user posted image
PM MAIL   Вверх
Anton Vatchenko
Дата 18.7.2008, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: -1
Всего: -1



Код

int main(void) {
    sck = socket(PF_INET, SOCK_STREAM, 0);
    if(sck == -1) {
        perror("Cannot create socket\n");
        exit(1);
    }

    int yes = 1;
    if (setsockopt(sck, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { 
        perror("setsockopt() error"); 
        exit(1); 
    }

    struct sockaddr_in sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(PORT);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(sck, (struct sockaddr*) &sa, sizeof (struct sockaddr)) == -1 ) {
        perror("Coudn't bind socket");
        close(sck);
        exit(1);
    }
    listen(sck, 3);

    signal(SIGCHLD, SIG_IGN);

    int sck2;
    int pid;
    while(1) {

        if((sck2 = accept(sck, NULL, NULL)) == -1) {
            log2P("Accept error");
            close(sck);
            break;
        }
        log2P("Accepted new connection %d\n", sck2);
        struct timeval tv;
        tv.tv_sec = 300;
        tv.tv_usec = 0;
        setsockopt(sck2, SOL_SOCKET, SO_RCVTIMEO, (struct timeval*) &tv, sizeof(struct timeval));

        pthread_t thread; //шфхэЄшЇшърЄюЁ яюЄюър
        int ret = pthread_create(&thread, NULL, connectionLoop, &sck2);
        if(ret != 0) {
            log2P("Error %d\n", ret);
        }
        pthread_detach(thread);
        log2P("Detached\n");
    }

    printf("Application finished\n");
}


Вот этот код...


Это сообщение отредактировал(а) Anton Vatchenko - 19.7.2008, 13:12


--------------------
user posted image
PM MAIL   Вверх
Anton Vatchenko
Дата 18.7.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: -1
Всего: -1



Только что попробовал убрать tv.tv_usec = 0; и заработало... Хотя вывел результат выполнения setsockopt - получилась ошибка.


Это сообщение отредактировал(а) Anton Vatchenko - 18.7.2008, 10:44


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 18.7.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Anton Vatchenko, ты за 400 сообщений так и не научился пользоваться тегом code?
PM   Вверх
Anton Vatchenko
Дата 19.7.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: -1
Всего: -1



Нет, за 400 сообщений так и не нашел воспитанных программистов. Смотрю скоро деньги придется платить за ответ... Чтобы ответили, или хоть не обзывали...


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.