accept() 函数
C语言中accept函数的使用和示例
accept()
在套接字编程中,accept() 函数用于接受来自客户端的连接请求,并创建一个新的套接字来与客户端进行通信。下面是关于 accept() 函数的详细说明:
函数原型
函数原型:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数解释
参数解释:
sockfd:套接字描述符,即已经处于监听状态的套接字。addr:用于存储客户端地址信息的结构体指针。在函数调用后,将填充客户端的地址信息。addrlen:指向存储客户端地址结构体长度的变量的指针。在函数调用前,需要将其设置为存储地址结构体的缓冲区长度。
函数返回值:
- 如果接受连接成功,返回值为新创建的套接字描述符(非负整数),用于后续的与客户端的通信。
- 如果发生错误,返回值为-1,并设置相应的错误代码,可以使用
perror()函数输出错误信息。
示例用法:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
return 1;
}
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(8080);
int bind_result = bind(sockfd, (struct sockaddr*)&server_address, sizeof(server_address));
if (bind_result == -1) {
perror("bind");
return 1;
}
int listen_result = listen(sockfd, 5);
if (listen_result == -1) {
perror("listen");
return 1;
}
printf("Listening for incoming connections...\n");
struct sockaddr_in client_address;
socklen_t client_addrlen = sizeof(client_address);
int client_sockfd = accept(sockfd, (struct sockaddr*)&client_address, &client_addrlen);
if (client_sockfd == -1) {
perror("accept");
return 1;
}
printf("Connection accepted from %s:%d\n", inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port));
return 0;
}
解释:
- 在这个示例中,我们先创建了一个套接字并将其绑定到指定的地址和端口。
- 然后,调用
listen()函数将套接字设置为监听状态。 - 使用
accept()函数来接受来自客户端的连接请求。在调用accept()之后,会创建一个新的套接字,用于与客户端进行通信。 addr参数将用于存储客户端的地址信息,addrlen参数指定了地址结构体的长度。- 如果接受连接成功,将输出客户端的 IP 地址和端口号。
注意事项:
- 在调用
accept()函数之前,必须先创建套接字并确保套接字已经绑定到一个地址,并处于监听状态。 accept()函数是一个阻塞调用,即在没有连接请求到达时,它将一直等待,直到有新的连接请求到达才会返回。- 每次调用
accept()函数只能接受一个连接请求,如果需要接受多个连接,需要在循环中多次调用accept()。 - 接受的连接会使用一个新的套接字来进行通信,原始的监听套接字仍然保持在监听状态,以接受更多的连接请求。