принять не удается с EFAULT - PullRequest
0 голосов
/ 09 марта 2011

У меня есть сокет-сервер, работающий на нескольких машинах.Он работает как чудо, кроме того, на один компьютер.

Сервер связывает правильно, но возвращает ошибку (EFAULT), когда клиент пытается подключиться.Идея, что источник проблемы может быть.Заранее большое спасибо!

Некоторая информация о машине: Linux версия 2.6.18.3 gcc версия 3.3.5 (Debian 1: 3.3.5-13)

Источник сервера сокетов довольно хорошпрямо вперед.

...
...
struct sockaddr_in server_addr;
struct sockaddr* client;
socklen_t alen;


sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
    ...
}

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(port);

if(bind(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0){
    ...
}

if(listen(sockfd,BACKLOG) == -1){
    ...
}

alen = sizeof(client);

new_fd = accept(sockfd, client, &alen);
if (new_fd == -1) {
        /*
        * this part of the code is executed
        * errno is set to 14
        */
}

Спасибо, что указали мне в правильном направлении.

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Используйте это:

struct sockaddr_in client;
...
alen = sizeof(client);
new_fd = accept(sockfd, (struct sockaddr *) &client, &alen);

accept ожидает указатель на существующий буфер, который он будет заполнять. У вас есть две ошибки, вы устанавливаете alen равным указателю и передаете неинициализированный указатель для принятия.

0 голосов
/ 09 марта 2011

со страницы руководства accept(2):

  EFAULT The addr argument is not in a writable part of the user  address
          space.

Убедитесь, что вы правильно выделили client.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...