网页无法访问如何解决h5,优化公司哪家好,网站建设打造,微信小程序开发管理使用基本的Linux系统调用来创建一个TCP socket#xff0c;监听端口8080#xff0c;并在接受到客户端连接时创建一个新的线程来处理连接。每个连接处理函数都是一个独立的线程#xff0c;读取客户端请求并发送固定的HTTP响应。 代码#xff1a;
#include iostream
… 使用基本的Linux系统调用来创建一个TCP socket监听端口8080并在接受到客户端连接时创建一个新的线程来处理连接。每个连接处理函数都是一个独立的线程读取客户端请求并发送固定的HTTP响应。 代码
#include iostream
#include string
#include cstring
#include sys/socket.h
#include arpa/inet.h
#include unistd.h
#include pthread.hconst int BUFFER_SIZE 1024;void *connection_handler(void *socket_desc) {int sock *(int *)socket_desc;char buffer[BUFFER_SIZE];std::string response HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nHello, World!;// 读取客户端请求ssize_t read_size read(sock, buffer, BUFFER_SIZE - 1);if (read_size 0) {buffer[read_size] \0;std::cout Received request:\n buffer std::endl;// 发送响应write(sock, response.c_str(), response.length());}// 关闭连接close(sock);delete (int *)socket_desc;return NULL;
}int main() {int server_fd, client_sock;struct sockaddr_in server_addr, client_addr;socklen_t addr_len sizeof(struct sockaddr_in);// 创建 socketserver_fd socket(AF_INET, SOCK_STREAM, 0);if (server_fd -1) {std::cerr Failed to create socket. std::endl;return 1;}// 设置服务器地址和端口server_addr.sin_family AF_INET;server_addr.sin_addr.s_addr INADDR_ANY;server_addr.sin_port htons(8080);// 绑定地址和端口if (bind(server_fd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) {std::cerr Failed to bind. std::endl;return 1;}// 监听连接if (listen(server_fd, 10) 0) {std::cerr Failed to listen. std::endl;return 1;}std::cout Server started. Listening on port 8080... std::endl;while (true) {// 接受客户端连接client_sock accept(server_fd, (struct sockaddr *)client_addr, addr_len);if (client_sock 0) {std::cerr Failed to accept connection. std::endl;continue;}std::cout New connection accepted. std::endl;// 创建线程处理连接pthread_t thread;int *new_sock new int;*new_sock client_sock;if (pthread_create(thread, NULL, connection_handler, (void *)new_sock) 0) {std::cerr Failed to create thread. std::endl;return 1;}// 分离线程使其自行释放资源pthread_detach(thread);}// 关闭服务器 socketclose(server_fd);return 0;
}代码解析
这段代码实现了一个简单的基于Linux的轻量级多线程HTTP服务。它的主要逻辑如下 引入所需的头文件和库包括iostream用于输入输出、string用于处理字符串、cstring用于字符串操作、sys/socket.h和arpa/inet.h用于socket编程、unistd.h用于关闭连接和pthread.h用于多线程编程。 定义常量和变量将缓冲区大小定义为BUFFER_SIZE并声明服务器socket文件描述符(server_fd)和客户端socket文件描述符(client_sock)以及服务器地址(server_addr)和客户端地址(client_addr)。 创建连接处理函数定义了一个名为connection_handler的函数该函数作为每个连接的处理函数。它接受一个void*类型的参数将其转换为int*类型表示客户端socket文件描述符。在该函数中首先从客户端读取请求并打印到控制台然后向客户端发送固定的HTTP响应。最后关闭客户端socket连接并释放分配的内存。 主函数在主函数中首先创建服务器socket(server_fd)。然后设置服务器地址和端口并将其与socket绑定。接下来开始监听连接请求。在一个无限循环中使用accept函数接受客户端连接并创建一个新的线程来处理连接。为了能够将客户端socket传递给新线程使用new运算符动态分配了一个int类型的指针new_sock并将客户端socket文件描述符赋值给它。然后使用pthread_create函数创建一个新的线程将新线程的执行函数设置为connection_handler并将new_sock作为参数传递给新线程。最后使用pthread_detach函数将新线程设置为分离状态使其在完成后自动释放资源。 关闭服务器socket在无限循环中无法达到的代码当服务端结束时关闭服务器socket(server_fd)。
这段代码使用了基本的Linux系统调用和pthread库来实现一个简单的多线程HTTP服务。它接受客户端连接并为每个连接创建一个独立的线程来处理请求和发送响应。需要注意的是这只是一个简化的示例实际的HTTP服务器需要考虑更多的功能和错误处理例如处理HTTP请求的各种方法、路径解析、错误处理等。