【socket】accept

1. accept函数用于接受客户端的连接请求,其语法为:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:

  • sockfd:服务器端套接字文件描述符。
  • addr:客户端地址结构体指针。
  • addrlen:客户端地址结构体长度指针。

返回值:

  • 成功:返回接受连接的socket描述符。
  • 失败:返回-1,并设置errno变量。

示例代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT 8888

int main()
{
    int sockfd, newsockfd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t sin_len = sizeof(client_addr);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1)
    {
        perror("socket");
        exit(1);
    }

    int yes = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
    {
        perror("setsockopt");
        exit(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)) == -1)
    {
        perror("bind");
        close(sockfd);
        exit(1);
    }

    if (listen(sockfd, 10) == -1)
    {
        perror("listen");
        close(sockfd);
        exit(1);
    }

    printf("waiting for connections...\n");

    while (1)
    {
        newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_len);
        if (newsockfd == -1)
        {
            perror("accept");
            continue;
        }

        printf("got connection from %s\n", inet_ntoa(client_addr.sin_addr));

        const char *msg = "Hello, World!";
        int msglen = strlen(msg) + 1;
        if (send(newsockfd, msg, msglen, 0) == -1)
            perror("send");

        close(newsockfd);
    }

    return 0;
}

在上述代码中,新连接的socket描述符被用于向客户端发送一条消息,然后立即关闭连接。在实际应用中,需根据具体需求设计处理逻辑。

2.accept()函数是C语言中用于处理socket连接的一个函数。当一个客户端尝试连接到服务器上时,accept()函数会创建一个新的socket,这个新的socket与客户端的socket连接,并返回这个新socket的文件描述符。

以下是一个accept()函数的基本使用示例:

#include
#include
int main() {
int sockfd, new_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 设置server地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 服务器端口号
server_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定socket到IP和端口
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(sockfd, 5) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
addr_size = sizeof(struct sockaddr_in);
// 接受一个客户端连接
new_sock = accept(sockfd, (struct sockaddr *)&client_addr, &addr_size);
if (new_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
// 使用新的socket进行读写操作
// ...
close(new_sock); // 关闭新的socket连接
close(sockfd); // 关闭监听socket
return 0;
}

注意,在实际的网络编程中,还需要处理错误,对socket进行读写操作,以及关闭socket等步骤。以上代码只是一个简单的示例,并没有包含所有的处理。

你可能感兴趣的:(C语言,编程,网络,网络,linux,c语言)