C语言实现的Web服务器

实现一个简单的Web服务器(C语言) Web服务器 github地址 该项目的第二部分是在第一部分的基础上继续完善Web服务器。 第二部分主要是完成两个功能:记录日志和HTTP响应。 记录日志 该部分比较简单,只要简单地将一些服务器的信息添加到指定日志文件即可, 也不需要完成很复杂的功能,有了日志功能也方便调试。 由于要在启动服务器时将日志文件传给main函数,所以我将日志文件名声明为 全局变量,方便在整个项目中往日志文件中添加日志信... 阅读详情

采摘处:http://blog.sina.com.cn/s/blog_4b73e760010007id.html


自己研究了好几天终于写出来一个,哈哈,当然也从网上得到了很多的帮助拉。谢谢大家咯!这个版本还不是很完善,但Web服务器的基本框架已经出来了,还有部分的功能需要进行进一步的测试和修改。虽然说C的开发比较慢,对于程序员来说比较难以操作,但通过用C写这些很底层的东西,可以更好的了解的象java的socket中的工作原理。有一定的帮助!
 
以下是源代码:

    /**************filename: Server.cpp**************** 
     该程序通过标准socket实现简单Http服务器 
     运行该服务器可以通过浏览器访问服务器目录下的 
     Html文件和jpg图片 完成初步的Http服务器功能 
    ***************************************************/  
    #include <winsock.h>  
    #include <sys/stat.h>  
    #include <iostream>  
    using namespace std;  
    #define SERVER_PORT 10000         //自定义的服务端口  
    #define HOSTLEN 256           //主机名长度  
    #define BACKLOG 10           //同时等待的连接个数  
    /************************************** 
     该方法包装了send() 
     通过该方法发送数据 能够全部发出 
     没有遗漏 
    **************************************/  
    int sendall(int s, char *buf, int *len) {  
     int total = 0;           // 已经发送字节数  
     int bytesleft = *len;                                   //还剩余多少字节  
     int n;  
     while(total < *len) {  
      n = send(s, buf+total, bytesleft, 0);  
      if (n == -1) { break; }  
      total += n;  
      bytesleft -= n;  
     }  
     *len = total;           // 返回实际发送出去的字节数  
     return n==-1?-1:0;          // 成功发送返回0 失败-1  
    }  
    /************************************** 
     该方法处理错误请求 
     并向客户端发送错误信息 
    **************************************/  
    void wrong_req(int sock) {  
     char* error_head = "HTTP/1.0 501 Not Implemented\r\n"; //输出501错误  
     int len = strlen(error_head);  
     if (sendall(sock, error_head, &len) == -1) {   //向客户发送  
      printf("Sending failed!");  
      return;  
     }        
     char* error_type = "Content-type: text/plain\r\n";    
     len = strlen(error_type);  
     if (sendall(sock, error_type, &len) == -1) {  
      printf("Sending failed!");  
      return;  
     }  
     char* error_end = "\r\n";  
     len = strlen(error_end);  
     if (sendall(sock, error_end, &len) == -1) {  
      printf("Sending failed!");  
      return;  
     }  
     char* prompt_info = "The command is not yet completed\r\n";  
     len = strlen(prompt_info);  
     if (sendall(sock, prompt_info, &len) == -1) {  
      printf("Sending failed!");  
      return;  
     }  
    }  
    /********************************** 
     该方法判断用户请求的文件是否存在 
     不存在返回true 存在返回false 
    ***********************************/  
    bool not_exit(char* arguments) {  
     struct stat dir_info;  
     return (stat(arguments, &dir_info) == -1);  
    }  
    /************************************* 
     所请求的文件不存在 
    *************************************/  
    void file_not_found(char* arguments, int sock) {  
     char* error_head = "HTTP/1.0 404 Not Found\r\n";   //构造404错误head  
     int len = strlen(error_head);  
     if (sendall(sock, error_head, &len) == -1) {    //向客户端发送  
      printf("Sending error!");  
      return;  
     }     
     char* error_type = "Content-type: text/plain\r\n";  
     len = strlen(error_type);  
     if (sendall(sock, error_type, &len) == -1) {  
      printf("Sending error!");  
      return;  
     }  
     char* error_end = "\r\n";  
     len = strlen(error_end);  
     if (sendall(sock, error_end, &len) == -1) {  
      printf("Sending error!");  
      return;  
     }  
     char prompt_info[50] = "Not found:  ";  
     strcat(prompt_info, arguments);  
     len = strlen(prompt_info);  
     if (sendall(sock, prompt_info, &len) == -1) {    //输出未找到的文件  
      printf("Sending error!");  
      return;  
     }      
    }  
    /************************************* 
     发送Http协议头部信息 
     其中包括响应类型和Content Type 
    *************************************/  
    void send_header(int send_to, char* content_type) {  
       
     char* head = "HTTP/1.0 200 OK\r\n";     //正确的头部信息  
     int len = strlen(head);  
     if (sendall(send_to, head, &len) == -1) {   //向连接的客户端发送数据  
      printf("Sending error");  
      return;  
     }  
     if (content_type) {         //content_type不为空  
      char temp_1[30] = "Content-type: ";    //准备好要连接的字串  
      strcat(temp_1, content_type);     //构造content_type  
      strcat(temp_1, "\r\n");  
      len = strlen(temp_1);  
      if (sendall(send_to, temp_1, &len) == -1) {  
       printf("Sending error!");  
       return;  
      }  
     }  
    }  
    /*********************************** 
     取得用户所请求的文件类型 
     即文件后缀 (.html .jpg .gif) 
    ************************************/  
    char* file_type(char* arg) {  
     char * temp;          //临时字符串指针  
     if ((temp=strrchr(arg,'.')) != NULL) {    //取得后缀  
      return temp+1;  
     }  
     return "";           //如果请求的文件名中没有. 则返回空串  
    }  
    /************************************* 
     该方法为程序核心 
     负责真正发送文件 如*.html *.jpg等 
    *************************************/  
    void send_file(char* arguments, int sock) {  
     char* extension = file_type(arguments);    //获得文件后缀名  
     char* content_type = "text/plain";     //初始化type='text/plain'  
     FILE* read_from;         //本地文件指针 从该文件中读取.html .jpg等  
     int readed = -1;         //每次读得的字节数  
       
     if (strcmp(extension, "html") == 0) {    //发送内容为html  
      content_type = "text/html";  
     }  
     if (strcmp(extension, "gif") == 0) {    //发送内容为gif  
      content_type = "image/gif";  
     }  
     if (strcmp(extension, "jpg") == 0) {    //发送内容为jpg  
      content_type = "image/jpg";  
     }  
     read_from = fopen(arguments, "r");     //打开用户指定的文件 准备读取  
     if(read_from != NULL) {        //指针不为空  
      char read_buf[128];        //读文件时的字节缓存数组  
      send_header(sock, content_type);    //发送协议头  
      send(sock, "\r\n", 2, 0);      //再加一个"\r\n" 不能缺少 格式要求  
      while(!feof(read_from)) {      //判断文件是否已经结束  
       fgets(read_buf, 128, read_from);   //读取  
       int len = strlen(read_buf);  
       if (sendall(sock, read_buf, &len) == -1) { //发送数据  
        printf("Sending error!");    //出现发送错误 显示到控制台 继续发送  
        continue;  
       }  
      }  
     }  
    }  
    /*********************************** 
     解析并处理用户请求 
    ***********************************/  
    void handle_req(char* request, int client_sock) {  
     char command[BUFSIZ];        //保存解析到的命令字段 GET PUT  
     char arguments[BUFSIZ];        //保存解析到的请求的文件  
     /* 
      * 在用户请求前加上当前目录符号 
      */  
     strcpy(arguments, "./");       //注意该符号在不同操作系统的区别  
     /* 
      * 解析请求 
      */  
     if (sscanf(request, "%s%s", command, arguments+2) != 2) {  
      return;           //解析出错在返回  
     }  
       
     printf("handle_cmd:    %s\n",command);    //向控制台输出此时的命令  
     printf("handle_path:   %s\n",arguments);   //向控制台输出此时的请求路径  
       
     if (strcmp(command, "GET") != 0) {     //请求命令格式是否正确  
      wrong_req(client_sock);  
      return;  
     }  
     if (not_exit(arguments)) {       //请求的文件是否存在    
      file_not_found(arguments, client_sock);  
      return;  
     }  
     send_file(arguments, client_sock);     //命令格式及请求路径正确则发送数据  
       
     return;  
    }  
    /************************************* 
     该方法构造服务器端的SOCKET 
     返回构造好的socket描述符 
    *************************************/  
    int make_server_socket() {  
     struct sockaddr_in server_addr;       //服务器地址结构体  
     int tempSockId;           //临时存储socket描述符  
     tempSockId = socket(PF_INET, SOCK_STREAM, 0);  
       
     if (tempSockId == -1) {         //如果返回值为-1 则出错  
      return -1;  
     }  
     /* 
      * 填充服务器连接信息 
      */  
     server_addr.sin_family = AF_INET;  
     server_addr.sin_port = htons(SERVER_PORT);  
     server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //本地地址  
     memset(&(server_addr.sin_zero), '\0', 8);  
     if (bind(tempSockId, (struct sockaddr *)&server_addr,  
      sizeof(server_addr)) == -1) {       //绑定服务 如果出错 则返回-1  
      printf("bind error!\n");  
      return -1;  
     }  
     if (listen(tempSockId, BACKLOG) == -1 ) {     //开始监听  
      printf("listen error!\n");  
      return -1;  
     }  
     return tempSockId;           //返回取得的SOCKET  
    }  
    /*********************** 
     主函数main() 
     程序入口 
    ***********************/  
    void main(int argc, char * argv[]) {  
     /* 
      * 调用WSAStartup() 便于访问sockets library 
      */  
     WSADATA wsaData;  
     if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {  
      fprintf(stderr, "WSAStartup failed.\n");  
      exit(1);  
     }  
     printf("My web server started...\n");  
     int server_socket;        //服务器的socket  
     int acc_socket;         //接收到的用户连接的socket  
     int sock_size = sizeof(struct sockaddr_in);    
     struct sockaddr_in user_socket;     //客户连接信息  
     server_socket = make_server_socket();   //创建服务器端的socket  
     if (server_socket == -1) {      //创建socket出错  
      printf("Server exception!\n");  
      exit(2);  
     }  
     /* 
      * 主循环 
      */  
     while(true) {  
      acc_socket = accept(server_socket, (struct sockaddr *)&user_socket, &sock_size); //接收连接  
        
      //cout << inet_ntoa(user_socket.sin_addr) << endl;    //测试用:-)//  
        
      /* 
       * 读取客户请求 
       */  
      int numbytes;  
      char buf[100];  
      if ((numbytes=recv(acc_socket, buf, 99, 0)) == -1) {  
       perror("recv");  
       exit(1);  
      }  
        
      //printf("buf ... %s", buf);      //测试用  
      /* 
       * 处理用户请求 
       */  
      handle_req(buf, acc_socket);  
     }  
    }  
    /**************程序结束Server.cpp******************/  




C 语言实现一个简单的 web 服务器 说到 web 服务器想必大多数人首先想到的协议是 http,那么 http 之下则是 tcp,本篇文章将通过 tcp 来实现一个简单的 web 服务器。 本篇文章将着重讲解如何实现,对于 http 与 tcp 的概念本篇将不过多讲解。 一、了解 Socket 及 web 服务工作原理 既然是基于 tcp 实现 web 服务器,很多学习 C 语言的小伙伴可能会很快的想到套接字 socket。socket 是一个较为抽象的通信进程,或者说是主机与主机进行信息交互的一种抽象。socket 可以将数据流送入网 阅读详情

相关推荐

C语言实现简易Web服务器实战教程

在当今数字化时代,Web服务器已成为信息交流的核心。C语言因其执行效率高、硬件操作能力强而被广泛用于开发性能关键型的Web服务器。本章首先介绍了Web服务器的基本概念,继而探讨C语言在此领域的应用优势。之后,本章将对实现Web服务器所需的网络编程知识做初步的概述,为读者后续章节的学习打下基础。作为起点,我们将理解Web服务器的基本工作原理,以及C语言如何能有效地构建出响应速度快、资源消耗低的Web服务系统。

weixin_35516624的博客 1067

从零构建一个简单的Web框架

在现代Web开发中,框架的使用极大地提高了开发效率和代码质量。然而,许多开发者对框架的内部原理知之甚少。本文将从零开始,逐步构建一个简单的Web框架,涵盖其核心概念、架构设计、代码实现、应用场景以及注意事项。通过本文的介绍,读者不仅能够理解Web框架的基本原理,还能掌握如何构建自己的框架。文章中将使用Mermaid格式绘制架构图和流程图,帮助读者更好地理解框架的运行机制。Web框架是一种用于开发Web应用程序的工具,它提供了一组预定义的组件和模式,帮助开发者快速构建Web应用。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 2345

C++开发web服务框架之HTTP Web框架的设计与实现

C++开发web服务框架之HTTP Web框架的设计与实现 基于vs2015与boost的程序

用C语言制作Web服务器

阅读经典——《深入理解计算机系统》09 本文,我们将使用C语言从零开始实现一个支持静态/动态网页的Web服务器。我们把这个服务器叫做Tiny。 背景知识客户端-服务器编程模型使用socket处理请求与响应HTTP协议与静/动态网页关键代码解析实验效果与源码 背景知识 Web服务器使用HTTP协议与客户端(即浏览器)通信,而HTTP协议又基于TCP/IP协议。因此我们要做的工作就

努力,可能成功!放弃,注定失败! 2万+

体系结构学习-6-超标量处理器

 MIPS32-5段流水线采用了指令级并行方式(5个流水段同时运行5条指令)提升系统吞吐率,是一种标量处理器(CPI≥1CPI \ge 1CPI≥1),但是一个周期一条指令以及无法满足现代计算机需求了。 超标量处理器(Superscalar) 1、基本思想:增强指令集并行,让每个周期执行更多指令,实现 CPI<1CPI<1CPI<1 。(IPC=1/CPIIPC = 1...

qq_40891899的博客 1212

地平线RDKX3初始配置与USB无线网卡

地平线X3无线网卡配置

Richard_Mei的博客 4077

C++ 开发 Web 服务框架 - HTTP Web 框架的设计与实现(二)

C++ 开发 Web 服务框架 - HTTP Web 框架的设计与实现 一、概述 项目介绍 服务器开发中 Web 服务是一个基本的代码单元,将服务端的请求和响应部分的逻辑抽象出来形成框架,能够做到最高级别的框架级代码复用。本次项目将综合使用 C++11 及 Boost 中的 Asio 实现 HTTP 和 HTTPS 的服务器框架。 项目涉及的知识点 C++基本知识

Watson2016的博客 1万+

从零拆解快手Web端__NS_hxfalcon:JS逆向签名参数定位与复现

在JS逆向与前端反爬攻防中,签名参数总是绕不开的核心环节。无论是接口加密还是请求签名,其本质都是通过在客户端收集环境信息、时间戳与业务参数,经特定算法计算后生成用于服务端校验的动态令牌。理解这类参数的生成原理,不仅能提升逆向分析效率,也能帮助前端开发者更好地设计自身接口防护方案。在实际工程中,面对经Webpack打包且高度混淆的代码,直接全局搜索参数名往往难以奏效,需要结合请求抓包、调用栈跟踪、环境适配等方法逐步定位。此类签名参数广泛存在于现代Web应用的GraphQL或REST接口中,是接口数据安全的重要

weixin_29474431的博客 336

C++web编程:C++Web框架W/嵌入式服务器(c++ web server)

我一直在寻找一个 C ++ Web 框架,这将允许我直接构建一个 GUI 控制面板到一个.dll 插件。,它具有嵌入式 Web 服务器,apache 模块,功能主机并可以在 Windows-Cygwin / BSD / Linux / Solaris 上运行。cppcms 有一个嵌入式服务器,在嵌入式解决方案中得到了很好的支持。文档是完整的,支持非常好,所以可能文档不够,开发人员一定会帮助你解决你的问题。易用性也将是一个巨大的优势,但我愿意花时间让它工作,只要它做什么是需要的。

Api19970108018的博客 802

深入解析:如何基于开源OpENer开发EtherNet/IP从站服务

通过OpENer开源库,开发者可以快速实现符合ODVA规范的EtherNet/IP从站设备,降低开发成本并提高系统灵活性。本文详细介绍了EtherNet/IP协议原理、OpENer库的特点与优缺点,以及二次开发的完整流程。通过遵循本文提供的指南,开发者可以成功构建出工业级的EtherNet/IP通信设备。

极地星辰 2998

Vivado IP核与约束文件管理指南:解决OOC警告、COE文件丢失与Block Design复用

本文详细介绍了Vivado IP核与约束文件管理的系统化方法,包括解决OOC警告、COE文件丢失与Block Design复用等常见问题。通过IP核锁定机制、分层约束架构和动态约束技术,提升FPGA工程的健壮性和团队协作效率,特别适合中大型项目开发。

weixin_30887919的博客 430

如何选择C语言Web框架:从轻量级到企业级完整指南

C语言作为系统级开发的利器,在Web开发领域同样拥有丰富的框架选择。本文将带您全面了解C语言Web框架的分类、特性及选型策略,帮助您根据项目需求快速找到最适合的解决方案。 ## 一、C语言Web框架的核心优势 C语言Web框架以其高性能、低资源占用和系统级访问能力著称,特别适合构建对性能要求严苛的后端服务。无论是嵌入式设备的轻量级应用,还是高并发的企业级系统,C语言框架都能提供稳定可靠的支持。

gitblog_00735的博客 552

Python 格点数据插值到站点 最邻近插值 双线性插值

python 气象数据格点数据插值到站点,最邻近插值法,双线性插值法

好记性不如烂笔头 8459

C语言实现简单的Web服务器

个人博客主页 https://www.boolo.top C语言实现简单的Web服务器。之前的文章利用C语言实现了基于TCP的WinSock套接字编程。基于此,同样可以使用C语言来实现简单的Web服务器

城南以南花亦开 1万+

GEE高阶应用——如何绘制2000-2022年土地利用变化轨迹时序图

土地利用变化是指在一定时间范围内,土地利用类型和结构发生的变化。时序变化是指这种变化随时间的推移而发生的序列变化。土地利用变化轨迹的时序变化具体介绍如下:首先,土地利用变化轨迹的时序变化体现在土地利用类型的演变上。在过去的几十年里,随着人口的增加、经济的发展和城市化的推进,土地利用类型发生了显著的变化。传统的农田逐渐减少,而城市、工业、交通、居住等用地的面积不断扩大。同时,随着环境保护意识的提高,生态保护用地、森林、湿地等绿色用地的面积也在增加。

此星光明博客 1113

K-Core, K-Shell & K-Crust傻傻分不清楚

K-Core(K-核)就是所有大于等于K的K-Shell的并集;K-Crust(K-皮)就是所有小于等于K的K-shell的并集。

欢迎订阅 -- 小源笔迹 2255

标准c语言实现web,C语言实现web服务器

// 初始化配置config结构体config* config_init() {config *conf;conf = malloc(sizeof(*conf));memset(conf, 0, sizeof(*conf));return conf;}// 释放配置void config_free(config *conf) {if (!conf) return;free(conf);}// 遍历...

weixin_29290963的博客 841

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Web 服务器的 C 语言实现

Web 服务器对应的文件是 MyHttp.c,代码示例如下, 其中使用到的页面文件(.html)需要用户自己提供,并且和程序在同一个位置。

ljy的博客 304

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c语言常用web服务器,c语言实现简单web服务器

c语言实现简单web服务器1http简单介绍http超文本传输协议:host主机地址:port端口/urlhost会被DNS服务器 解析成IP地址,所以有时候可以直接用域名,http默认访问80端口,https默认访问443端口大致流程就是:浏览器输入地址后,首先和web服务器建立tcp连接,然后浏览器发送http请求报文, web服务器响应处理这个报文,然后给他回复一个响应,然后服务器主动断开连...

weixin_29534421的博客 492

c语言实现简单web服务器

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34233421的博客 312

用C语言实现的简单Web服务器

有用的 技术文章:web服务器 http://blog.youkuaiyun.com/crazy_fire/article/details/7478304  http://blog.chinaunix.net/uid-22568683-id-84698.html  用C语言实现的简单Web服务器(Linux)

IT小小鸟 4136

应用——基于C语言实现的简易Web服务器开发

本文介绍了一个基于C语言实现的简易Web服务器项目。该项目支持HTTP/1.1协议,能够处理HTML页面和图片文件请求,并实现基本的登录验证功能。核心功能包括:1)使用Socket编程实现网络通信;2)解析HTTP请求并构造响应;3)根据文件类型动态设置Content-Type;4)实现用户登录验证逻辑。项目采用模块化设计,包含服务器主程序、HTML页面和图片资源等文件,通过分块读取方式高效传输文件。该项目适合学习网络编程基础,理解HTTP协议工作原理,以及掌握C语言在实际项目中的应用。

2301_78295956的博客 1154
上一篇: 用C语言实现的简单Web服务器(Linux)
下一篇: Ubuntu解决打开windows记事本.txt文件乱码的方法
crazy_fire
博客等级 码龄18年 19粉丝 57原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值