当前位置:首页 > CN2资讯 > 正文内容

C实现简单web服务器-2(windows)

6小时前CN2资讯

这里接着介绍上篇的内容:
本来构造响应报文应该在上一篇一起介绍的,东西比较多就留到这里说了。 


 

这里我只弄了最基础简单的5行,还有非常多功能是没有的,有兴趣的可能去查看http/1.1的RFC文档,现在都有中文版pdf的了,或者也可以使用curl命令先看看apache服务器构造了哪些: 



下面只说有实现的,其他如Cache缓存控制等可以去查上面说的RFC文档 


第一行:Connection:keep-alive
持续连接,默认http/1.1就是持续的,可以不用发这个


第2行:Date:…
时间,也不是必须的,强调一下,这里的时间是你收到请求响应的服务器时间,并不是显示到你浏览器的时间,因为传输过程中还是会有一些时延的


第3行:Server:…
也不是必须的,比如apache的就会写成:Apache/2.4.10,可以改成自己喜欢的内容


第4行:Content-Length: 95
发送实体的长度,即这里文件1.html的长度


第5行:Content-Type:text/html
用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件;如果这里你没有指定类型,比如这时传输一个html文档,360浏览器可能就不会显示出来而是直接下载该文档了;
Content-Type有很多类型,详见http/1.1 RFC文档


下面是简单客户端的C代码:

#include <Winsock2.h> #include <stdio.h> #include<string.h> #pragma comment(lib,"Ws2_32.lib") #define  BUF_LENGTH 1024 #define USER_ERROR -1 int main() {     WSADATA wsData;     SOCKET sClient;           //客户端套接字     struct sockaddr_in ser;   //服务器进程地址     char send_buf[BUF_LENGTH];  //发送缓存     char recv_buf[BUF_LENGTH];  //接收缓存     int iSend, iRecv;            //接收数据和发送数据长度     //第一步:加载协议栈     if (WSAStartup(MAKEWORD(2,2),&wsData)!=0)     {         printf("Failed to load Winsock.\n");         return USER_ERROR;     }     //创建服务器地址     ser.sin_family=AF_INET;     ser.sin_port=htons(80);                  //服务器端口号     ser.sin_addr.s_addr=inet_addr("127.0.0.1");        //服务器IP地址     //第二步:创建流套接字,运输层采用TCP协议     sClient=socket(AF_INET,SOCK_STREAM,0);     if (sClient==INVALID_SOCKET)     {         printf("socket() Failed:%d\n",WSAGetLastError());         return USER_ERROR;     }     //第三步:通过创建的套接字向相应的服务器发起连接请求     if (connect(sClient,(struct sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET)     {         printf("connet() Failed:%d\n",WSAGetLastError());         return USER_ERROR;     }     else   //连接成功     {              //第四步:通过套接字发数据         printf("input data to send:\n");         memset(send_buf,0,sizeof(send_buf));  //缓存清0         gets(send_buf);         iSend=send(sClient,send_buf,sizeof(send_buf),0);  //通过套接字发送数据给服务器         if (iSend==SOCKET_ERROR)   //发送不成功         {             printf("send() Failed:%d\n",WSAGetLastError());             return USER_ERROR;         }         else              printf("send success\n");  //发送成功         printf("recv data from server: \n");         while(1)         {             memset(recv_buf,0,sizeof(recv_buf));  //缓存清0             iRecv=recv(sClient,recv_buf,sizeof(recv_buf),0);             if(strcmp(recv_buf,"") == 0)    // 接收缓存为空则表示接受完毕,退出                 break;             if (iRecv ==SOCKET_ERROR)   //接收错误             {                 printf("recv() Failed:%d\n",WSAGetLastError());                 return USER_ERROR;             }             else                     printf("%s\n",recv_buf);    // 打印接收缓存         }     }         //第五步:释放该套接字,断开连接     closesocket(sClient);     WSACleanup();     return 0; }

 

首先运行上次的web服务器,然后再运行客户端: 


例1、输入:HEAD /1.html HTTP/1.1     表示使用HEAD方法获取首部


例2、输入:HEAD /1.htmlxxx HTTP/1.1


例3、输入:GET /1.html HTTP/1.1  返回首部和实体,即这里的文件内容


例4、输入:GET /1.htmlxxx HTTP/1.1

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/30924.html

    分享给朋友:

    “C实现简单web服务器-2(windows)” 的相关文章

    如何免费获取DigitalOcean学生包:$200云服务器信用额度详解

    什么是 DigitalOcean 学生包 DigitalOcean 学生包是 DigitalOcean 与 GitHub Education 合作推出的一项专为学生设计的优惠计划。它为通过 GitHub 学生计划验证的学生提供 $200 的免费信用额度,用于在 DigitalOcean 平台上构建和...

    国外服务器推荐:提升您的在线业务效率的最佳选择

    在如今全球化的时代,选择合适的国外服务器显得尤为重要。互联网的快速发展让许多企业不仅仅局限于当地市场,跨国经营已成为常态。这种趋势使得大量用户开始寻找更为高效、灵活的服务器解决方案,以满足不同地区客户的需求。服务器不仅是维护在线业务的基础设施,还是保证用户体验的关键因素。 选择国外服务器时,不仅需要...

    国外常用ping工具及其使用方法

    ping工具在国外的应用 什么是ping工具?其基本功能和重要性 ping工具是一种非常实用的网络诊断工具,通过向指定的IP地址发送数据包来检测网络连接的质量。当我们在互联网上进行访问时,ping工具能够帮助我们了解网络延迟、丢包率等关键指标。这些信息对于网站运营者和普通用户来说都是极其重要的,因为...

    Hostodo VPS主机使用体验与性能评测

    当我第一次听说Hostodo时,正是2014年,这家美国VPS主机商在市场上开始崭露头角。印象中,它的低价VPS产品让我感到十分吸引,尤其是在对比市场上其他的主机商时,Hostodo的性价比确实相当有优势。它主营的KVM型和NVMe硬盘的KVM型VPS在当时的市场中并不是常见的选择,迅速吸引了许多站...

    AS4837和AS9929线路在国际通信中的优势与应用分析

    在了解AS4837线路的历史背景时,回顾其起源与发展非常重要。AS4837线路,通常被称为中国联通的骨干网线路,最早始建于20世纪90年代。那时,随着互联网的兴起,全球对网络基础设施的需求不断增加,中国决定建立更强大的国际连接,通过AS4837将中国大陆与香港、美国、日本、韩国等多地紧密相连。这个决...

    Virtono:高性价比的虚拟主机与云服务器解决方案

    在这个信息化迅猛发展的时代,虚拟主机与服务器服务需求越来越高。而提到这个领域,其中有一家备受注目的公司,那就是Virtono。成立于2014年的Virtono,凭借其卓越的产品与服务迅速在全球市场上崭露头角。对于我来说,Virtono的故事不仅仅代表着一家公司,更是一段不断创新与发展的旅程。 Vir...