乐闻世界logo
搜索文章和话题

套接字API accept()函数是如何工作的?

2 个月前提问
2 个月前修改
浏览次数13

1个答案

1

套接字API中的accept()函数是用于服务器端的,它的作用是从监听队列中接受一个新的连接请求,并为这个连接请求创建一个新的套接字。

当服务器正在监听某个端口等待客户端的连接请求时,客户端通过调用connect()函数请求与服务器建立连接。这时,服务器端的accept()函数就会从其设置的监听队列中提取出连接请求来处理。

accept()函数的工作流程大致如下:

  1. 等待连接请求accept()函数会在没有连接请求时阻塞,直到收到一个连接请求。
  2. 提取连接请求:一旦有客户端的连接请求达到,accept()函数会从监听队列中提取出请求,并为这个新的连接创建一个新的套接字。这个新的套接字用于服务器与客户端之间的通信,而原来的套接字继续监听其他的连接请求。
  3. 返回新套接字accept()函数返回这个新创建的套接字的描述符。服务器通过这个新的套接字与客户端进行数据交换。

示例

假设您正在实现一个简单的服务器,用于接收客户端的信息,服务器端的代码可能会包括以下部分:

c
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd, new_sockfd; // sockfd用于监听,new_sockfd用于新的连接 struct sockaddr_in host_addr, client_addr; // 服务器和客户端的地址信息 socklen_t sin_size; int yes = 1; // 创建套接字 if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) perror("socket"); // 设置套接字选项 if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) perror("setsockopt"); // 绑定地址到套接字 host_addr.sin_family = AF_INET; host_addr.sin_port = htons(4000); host_addr.sin_addr.s_addr = INADDR_ANY; memset(&(host_addr.sin_zero), 0, 8); if (bind(sockfd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr)) == -1) perror("bind"); // 监听端口 if (listen(sockfd, 5) == -1) perror("listen"); // 循环接受连接 while(1) { sin_size = sizeof(struct sockaddr_in); new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size); if (new_sockfd == -1) perror("accept"); else { // 处理新连接,例如发送和接收数据 send(new_sockfd, "Hello, world!\n", 14, 0); // 关闭新的套接字 close(new_sockfd); } } return 0; }

在这个示例中,服务器使用socket()创建一个套接字进行监听,然后使用bind()绑定地址,使用listen()开始监听。当客户端连接时,accept()会被调用,接受连接并生成一个新的套接字new_sockfd用于和客户端通信。之后可以通过这个新的套接字发送消息给客户端,或者接收客户端发送的消息。

2024年7月15日 17:39 回复

你的答案