接受因EFAULT而失败

时间:2011-03-09 20:05:51

标签: c linux sockets tcp

我有一台在多台机器上运行的套接字服务器。除了一台机器之外,它就像一个魅力。

服务器绑定正确但在客户端尝试连接时返回错误(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 个答案:

答案 0 :(得分:3)

使用此:

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

accept需要一个指向现有缓冲区的指针,它将填入。你有两个错误,你将alen设置为指针的大小,并传递一个未初始化的指针接受。

答案 1 :(得分:0)

来自accept(2)手册页:

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

检查以确保您已正确分配client