我有一台在多台机器上运行的套接字服务器。除了一台机器之外,它就像一个魅力。
服务器绑定正确但在客户端尝试连接时返回错误(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
*/
}
感谢您指点我正确的方向。
答案 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
。