Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Сокеты. Проблема с accept() после fork()


Автор: nibble 25.7.2010, 19:08
Всё идёт хорошо, пока подключаются новые клиенты. Но как только один из них завершит соединение, следующий вызов accept() завершится ошибкой: "Interrupted system call".
Помогите? Почему так происходит?

Полный код ниже.

Код

    int port = 3434;
    int ls = socket(AF_INET, SOCK_STREAM, 0);

    if (ls < 0)
        throw Server_Exception("Ошибка создания сокета");
    
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = INADDR_ANY;
    
    int opt = 1;
    setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    
    int bind_status = bind(ls, (struct sockaddr *) &addr, sizeof(addr));
    if ( bind_status < 0 )
        throw Server_Exception("Ошибка функции bind()");
    
    int listen_status = listen(ls, 5);
    if ( listen_status < 0 )
        throw Server_Exception("Ошибка функции listen()");

    while (true) {
        printf("Waiting for connections...\n");

        int cs = accept(ls, NULL, NULL);
        
        if (-1 == cs)
            throw Server_Exception("accept");
        
        switch(fork()) {
            case -1:
                throw Server_Exception("fork");
            case 0:
                close(ls);
                while(1) {
                int bytes_read = recv(sock, buf, 1024, 0);
                if (bytes_read <= 0)
                                break;
                send(sock, buf, bytes_read, 0);
            }
                shutdown(cs, 2);
                close(cs);
                exit(0);
            default:
                close(cs);
        }
    }

Автор: MAKCim 26.7.2010, 21:41
дочерний процесс генерирует SIGCHLD при завершении

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