The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"ошибка EFAULT в функции accept *nix"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"ошибка EFAULT в функции accept *nix"  
Сообщение от Yotce (ok) on 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);

}

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "ошибка EFAULT в функции accept *nix"  
Сообщение от Michelnok (ok) on 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 пытается писать по этому адресу и, ессно, обламывается.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру