Linux下HTTP Server

Linux下HTTP Server

想在Linux下实现一个简单的web Server并不难。一个最简单的HTTP Server不过是一个高级的文件服务器,不断地接收客户端(浏览器)发送的HTTP请求,解析请求,处理请求,然后像客户端回送数据。在大多是情况下,(GET、POST命令),服务求回传给客户端的都是文件(HTML 文档, 图片,javascript脚本等等)。 下面是一个极简单的HTTP Server的demo,虽然只处理GET请求并发送单一文件,但基本展示了web server的框架。我的例子试图将功能和结构做到最精简,这样,一个http server的基本结构,便一目了然。 #include<sys/socket.h> #include<errno.h> #include<netinet/in.h> #include<string.h> #include<stdio.h> #define BUF_LEN 1028 #define SERVER_PORT 8080 //定义好的html页面,实际情况下web server基本是从本地文件系统读取html文件  const static char http_error_hdr[] = "HTTP/1.1 404 Not Found\r\nContent-type: text/html\r\n\r\n"; const static char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; const static char http_index_html[] = "<html><head><title>Congrats!</title></head>" "<body><h1>Welcome to our HTTP server demo!</h1>" "<p>This is a just small test page.</body></html>"; //解析到HTTP请求的文件后,发送本地文件系统中的文件 //这里,我们处理对index文件的请求,发送我们预定好的html文件 //呵呵,一切从简!  int http_send_file(char *filename, int sockfd) { if(!strcmp(filename, "/")){ //通过打印发现确实为”/" ,估计默认请求的是根目录 //通过write函数发送http响应报文;报文包括HTTP响应头和响应内容--HTML文件   write(sockfd, http_html_hdr, strlen(http_html_hdr)); write(sockfd, http_index_html, strlen(http_index_html)); } else{ // 文件未找到情况下发送404error响应  printf("%s:file not find!\n",filename); write(sockfd, http_error_hdr, strlen(http_error_hdr)); } return 0; } //HTTP请求解析  void serve(int sockfd){ char buf[BUF_LEN]; read(sockfd, buf, BUF_LEN); if(!strncmp(buf, "GET", 3)){ char *file = buf + 4; char *space = strchr(file, ' '); *space = '\0'; http_send_file(file, sockfd); } else{ //其他HTTP请求处理,如POST,HEAD等 。这里我们只处理GET  printf("unsupported request!\n"); return; } } void main(){ int sockfd,err,newfd; struct sockaddr_in addr; //建立TCP套接字  sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0){ perror("socket creation failed!\n"); return; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; //这里要注意,端口号一定要使用htons先转化为网络字节序,否则绑定的实际端口 //可能和你需要的不同  addr.sin_port = htons(SERVER_PORT); addr.sin_addr.s_addr = INADDR_ANY; if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){ perror("socket binding failed!\n"); return; } listen(sockfd, 128); for(;;){ //不间断接收HTTP请求并处理,这里使用单线程,在实际情况下考虑到效率一般多线程  newfd = accept(sockfd, NULL, NULL); serve(newfd); close(newfd); } } 
不到80行代码,就可以实现一个超简单的http服务器了。
转载自:http://blog.csdn.net/ruizeng88/article/details/6682028

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109473.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python下使用cv2.drawContours填充轮廓颜色「建议收藏」

    你要的答案或许都在这里:小鹏的博客目录在使用cv2.drawContours进行轮廓的颜色填充时要注意一点:(1)颜色填充时:给其传参数的时候,需要搞一个轮廓的list给他,要不会导致颜色填充失败。(2)画轮廓线时:就没必要搞list了,直接contours[i]就可以。python代码:图片:背景为黑色,有很多白色填充的。下面代码是去除图片中自定义面积小的轮廓

  • Laravel 5.6 安装 guzzlehttp

    Laravel 5.6 安装 guzzlehttp

    2021年10月24日
  • quartus ii12.1安装教程_ghost手动安装教程

    quartus ii12.1安装教程_ghost手动安装教程安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文。1.鼠标右击【QuartusII11.0】压缩包选择【解压到QuartusII11.0】。2.双击打开解压后的【QuartusII11.0】文件夹。3.双击打开【Quartus】文件夹。4.鼠标右击【11.0_quartus_windows.exe】选择【以管理员身份运行】。5.点击【Install】。6.解压中。7.勾选【AllowAlter…

    2022年10月15日
  • python和C语言的差别

    python和C语言的差别之前在公司一直做的是C语言的开发,然后做的都是业务方面的东西,做的是sdk,因为最近在找工作,然后今天面试的时候被问到C语言和Python的区别,自己只是简单的说了C是静态语言,在变量在使用前进行声明

  • Tomcat调优和JVM优化[通俗易懂]

    Tomcat调优和JVM优化[通俗易懂]Tomcat本身优化工作方式选择为了提升性能,首先就要对代码进行动静分离,让Tomcat只负责jsp文件的解析工作。如采用Apache和Tomcat的整合方式,他们之间的连接方案有三种选择,JK、http_proxy和ajp_proxy。相对于JK的连接方式,后两种在配置上比较简单的,灵活性方面也一点都不逊色。但就稳定性而言不像JK这样久经考验,所以建议…

  • 切蛋糕(贪心 or 优先队列)

    切蛋糕(贪心 or 优先队列)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号