URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6909
[ Назад ]

Исходное сообщение
"ошибка EFAULT в функции accept *nix"

Отправлено Yotce , 03-Ноя-07 04:03 
Помогите найти причину возникновения этой ошибки.

понял то - что функция не может писать в client_addr но почему?
или это не так?

пример кода:
//Linux Fedora core 3
//Kernel 2.6.9-1.667smp
//gcc 3.4.2-6

int main()
    int  opt;

    struct sockaddr_in server_addr;
    static struct sockaddr_in client_addr;  

    int server_socket;
    int socket_recv;
  
    if( ! (server_socket = socket (AF_INET, SOCK_STREAM, 0)) )
    {
        close(server_socket);

  return 0;
    }
  
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons (5011);

    if( bind(server_socket, (struct sockaddr *) &server_addr, sizeof (server_addr)) == -1)
    {
        close(server_socket);

  return 0;
    }
  
    if(listen(server_socket, 5) == -1)
    {
  close(server_socket);

  return 0;
    }


    errno = 0;
    if((socket_recv = accept(server_socket, (struct sockaddr *) &client_addr,
    (socklen_t *) sizeof (struct sockaddr_in) )) <= 0)
    {
  printf(" errno = %d\n", errno);
  perror("accept");

  switch(errno)
  {
      case EFAULT:
        printf(" bad addr\n");
    break;
      default:
        printf(" errno = %d\n", errno);
        shutdown(server_socket, SHUT_RDWR);
        close(server_socket);        
    return 0;
  }

    }

    printf("accepted connection from %s, port %d\n", inet_ntoa(client_addr.sin_addr), htons(client_addr.sin_port)) ;


    shutdown(server_socket, SHUT_RDWR);
    shutdown(socket_recv, SHUT_RDWR);  
    close(socket_recv);    
    close(server_socket);

}


Содержание

Сообщения в этом обсуждении
"ошибка EFAULT в функции accept *nix"
Отправлено Michelnok , 03-Ноя-07 15:06 

>    errno = 0;

socklen_t len = sizeof client_addr;
>    if((socket_recv = accept(server_socket, (struct sockaddr *) &client_addr,

&len )) <= 0)

А ты пишешь (socklen_t *) sizeof (struct sockaddr_in), т.е. числовую константу преобразовываешь в указатель, т.е. в адрес. Потом accept пытается писать по этому адресу и, ессно, обламывается.