c程小白<一>

作者原本认为电脑仅用于娱乐,后来意识到编程如C语言对于计算机的重要性。C语言被视为软件的灵魂,与计算机的功能紧密相关。尽管学习过程中遇到困难,但仍保持乐观态度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       我是农村的嘛,以为电脑就是拿来打打游戏,看看电影啥的。我也不晓得还有c程这种神奇的东西。。

虽然上课是懵懵懂懂的,多敲点键盘多看下资料,而后还是发觉c程很重要,应该是好多软件的灵魂,或者说精神元素。

肉体总是按照精神需求来行动的。

        对于一个计算机,我认为它有两个功能,一个是翻译并执行语言,还有就是储存语言。显然都与c语言密切相关哪!

所以我觉得人们发明这们技术,其实就是想让计算机更全面更自动化,毕竟人懒机器不会懒嘛!惊讶我也希望每天哪儿也

用去就躺床上想一下今天该做什么,然后就有谁代替我去执行了,完了还把结果输出给我@werng是中国lol强队)

       c程可能真的有用,我觉得!我没学到什么高科技,但是制定个乘法运算加法运算还是能的!总之到现在我还是保持一个乐观的态度来学,我相信很多同学也是如此,虽然表面说凉凉,但内心充满了生的希望。

    现在最大的问题就是运用电子科技的时候,学习的欲望不强,总是想玩:觉得手里拿着手机,ipad,学习总是别扭的!这很需要

我自变一下,慢慢来吧!c语言@

// webserver_epoll.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/epoll.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #define PORT 80 #define MAX_EVENTS 100 #define BUFFER_SIZE 4096 #define WEBROOT "./webroot" // 获取文件扩展名对应的Content-Type const char* get_content_type(const char* path) { const char *ext = strrchr(path, '.'); if (!ext) return "text/plain"; if (strcmp(ext, ".html") == 0 || strcmp(ext, ".htm") == 0) return "text/html; charset=utf-8"; if (strcmp(ext, ".css") == 0) return "text/css"; if (strcmp(ext, ".js") == 0) return "application/javascript"; if (strcmp(ext, ".png") == 0) return "image/png"; if (strcmp(ext, ".jpg") == 0 || strcmp(ext, ".jpeg") == 0) return "image/jpeg"; if (strcmp(ext, ".gif") == 0) return "image/gif"; if (strcmp(ext, ".ico") == 0) return "image/x-icon"; return "text/plain"; } void handle_request(int client_socket) { char buffer[BUFFER_SIZE] = {0}; read(client_socket, buffer, BUFFER_SIZE); char method[10], path[1024]; sscanf(buffer, "%s %s", method, path); if (strcmp(method, "GET") == 0) { char file_path[2048]; snprintf(file_path, sizeof(file_path), "%s%s", WEBROOT, path); // 处理目录请求 if (path[strlen(path) - 1] == '/') { strcat(file_path, "Index.html"); } // 检查文件是否存在 struct stat file_stat; if (stat(file_path, &file_stat) < 0 || !S_ISREG(file_stat.st_mode)) { // 尝试添加index.html // 特殊处理 favicon.ico 请求 if (strcmp(path, "/favicon.ico") == 0) { // 文件不存在时返回 204 No Content const char *response = "HTTP/1.1 204 No Content\r\n" "Connection: close\r\n" "\r\n"; send(client_socket, response, strlen(response), 0); } if (stat(file_path, &file_stat) < 0) { printf("File does not exist: %s (%s)\n", file_path, strerror(errno)); char *response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n<h1>404 Not Found</h1>"; write(client_socket, response, strlen(response)); close(client_socket); pthread_exit(NULL); } } // 获取正确的Content-Type const char *content_type = get_content_type(file_path); // 打开文件 FILE *file = fopen(file_path, "rb"); // 二进制模式 if (!file) { printf("Could not open file: %s (%s)\n", file_path, strerror(errno)); char *response = "HTTP/1.1 500 Internal Server Error\r\n\r\n"; write(client_socket, response, strlen(response)); close(client_socket); pthread_exit(NULL); } // 发送HTTP头 char header[BUFFER_SIZE]; int header_len = snprintf(header, sizeof(header), "HTTP/1.1 200 OK\r\n" "Content-Type: %s\r\n" "Content-Length: %ld\r\n" "Connection: close\r\n\r\n", content_type, file_stat.st_size); write(client_socket, header, header_len); // 发送文件内容 size_t bytes_sent = 0; while (bytes_sent < file_stat.st_size) { size_t to_read = file_stat.st_size - bytes_sent; if (to_read > BUFFER_SIZE) to_read = BUFFER_SIZE; size_t read_bytes = fread(buffer, 1, to_read, file); if (read_bytes <= 0) break; write(client_socket, buffer, read_bytes); bytes_sent += read_bytes; } fclose(file); } else if (strcmp(method, "POST") == 0) { char *content = strstr(buffer, "\r\n\r\n") + 4; char response[BUFFER_SIZE]; snprintf(response, sizeof(response), "HTTP/1.1 200 OK\r\n" "Content-Type: text/html\r\n\r\n" "<html><body>" "<h1>POST Received</h1>" "<p>Data: %s</p>" "</body></html>", content); send(client_socket, response, strlen(response), 0); } close(client_socket); } int main() { int server_fd, epoll_fd; struct sockaddr_in address; int addrlen = sizeof(address); // 创建TCP套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置非阻塞 int flags = fcntl(server_fd, F_GETFL, 0); fcntl(server_fd, F_SETFL, flags | O_NONBLOCK); // 绑定端口 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接 if (listen(server_fd, 10) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } // 创建epoll实例 epoll_fd = epoll_create1(0); if (epoll_fd == -1) { perror("epoll_create1"); exit(EXIT_FAILURE); } struct epoll_event event; event.events = EPOLLIN; event.data.fd = server_fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, &event) == -1) { perror("epoll_ctl"); exit(EXIT_FAILURE); } printf("Epoll server listening on port %d\n", PORT); struct epoll_event events[MAX_EVENTS]; while (1) { int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); if (num_events == -1) { perror("epoll_wait"); continue; } for (int i = 0; i < num_events; i++) { if (events[i].data.fd == server_fd) { // 接受新连接 int new_socket; while ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) > 0) { // 设置新连接为非阻塞 int flags = fcntl(new_socket, F_GETFL, 0); fcntl(new_socket, F_SETFL, flags | O_NONBLOCK); event.events = EPOLLIN | EPOLLET; event.data.fd = new_socket; epoll_ctl(epoll_fd, EPOLL_CTL_ADD, new_socket, &event); } } else { // 处理客户端请求 handle_request(events[i].data.fd); epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL); } } } close(server_fd); return 0; } 以上代码实现使用IO多路复用epoll搭建http服务器,但总是在缺少favicon.ico文件时退出,请修改
最新发布
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值