C++, sockets, accept(), linux, EOF, падение клиента

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Ru}{eeZ, 16 May 2011.

  1. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Часть работы с клиентом:
    Code:
        int socket_handler, bytes_read, buf_size = 1024;
        char buf[buf_size];
    
        while(true)
        {
            int socket_handler;
            if((socket_handler = accept(socket_listener, 0, 0)) == -1)
            {
                perror("accept()");
                exit(1);
            }
    
            int bytes_read, buf_size = 1024;
            char buf[buf_size];
    
            while(true)
            {
                bytes_read = 0;
                memset(buf, 0, buf_size);
    
                bytes_read = recv(socket_handler, buf, buf_size, 0);
                cout << "buf: " << buf << "bytes_read: '" << bytes_read << "'" << endl;
    
                if(bytes_read <= 0)
                    break;
    
                send(socket_handler, buf, bytes_read, 0);
            }
    
            close(socket_handler);
        }
    
    Если подрубаюсь через netcat, шлю текст, приходит эхо, далее ctrl + c / ctrl + d (EOF / конец файла) и закрывается соединение на обоих сторонах, если же жму ctrl + z (остановка программы), то закрывается соединение на стороне клиента, а на стороне сервера провисает - как предусмотреть подобную ситуацию, чтобы сервер закрывал соединение?

    По ходу я с командами (ctrl + ...) напутал...
     
    #1 Ru}{eeZ, 16 May 2011
    Last edited: 16 May 2011
  2. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Тут дело в netcat'е (с telnet'ом то все ок), после ctrl+d он больше не реагирует на ввод, но сокет держит - о чем свидетельствует netstat. Не знаю, что ты хочешь, но можешь сделать таймаут при помощи select.
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Можно поставить таймаут на recv и тогда тоже проблем не будет