accept() 函数

C语言中accept函数的使用和示例

2024-07-15 2 分钟阅读

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()
  • 接受的连接会使用一个新的套接字来进行通信,原始的监听套接字仍然保持在监听状态,以接受更多的连接请求。