Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > GDB и SO_RCVTIMEO


Автор: Anton Vatchenko 17.7.2008, 17:35
Итак. У меня Федора 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, и как это исправить?

Автор: Anton Vatchenko 18.7.2008, 07:39
Код

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 18.7.2008, 10:32
Только что попробовал убрать tv.tv_usec = 0; и заработало... Хотя вывел результат выполнения setsockopt - получилась ошибка.

Автор: bsa 18.7.2008, 22:23
Anton Vatchenko, ты за 400 сообщений так и не научился пользоваться тегом code?

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)