简单的http服务器


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>#define N 1024
#define ERR_LOG(errmsg) do{\perror(errmsg);\printf("%s - %s - %d\n", __FILE__, __func__, __LINE__);\exit(1);\}while(0)void *pthread_fun(void *arg)
{int acceptfd = *(int *)arg;char buf[N] = "";char head[]="HTTP/1.1 200 OK\r\n"                   \"Content-Type: text/html\r\n"       \"\r\n";    char err[]= "HTTP/1.1 404 Not Found\r\n"        \"Content-Type: text/html\r\n"       \"\r\n"                              \"<HTML><BODY>File not found</BODY></HTML>";//接收浏览器通过http协议发送的数据包if(recv(acceptfd, buf, N, 0) < 0){ERR_LOG("fail to recv");}printf("*****************************\n\n");printf("%s\n", buf);// int i;// for(i = 0; i < 200; i++)// {//     printf("[%c] - %d\n", buf[i], buf[i]);// }printf("\n*****************************\n");//通过获取的数据包中得到浏览器要访问的网页文件名//GET /about.html http/1.1char filename[128] = "";sscanf(buf, "GET /%s", filename);   //sscanf函数与空格结束,所以直接可以获取文件名if(strncmp(filename, "HTTP/1.1", strlen("http/1.1")) == 0){strcpy(filename, "about.html");}printf("filename = %s\n", filename);char path[128] = "./sqlite/";strcat(path, filename);//通过解析出来的网页文件名,查找本地中有没有这个文件int fd;if((fd = open(path, O_RDONLY)) < 0){//如果文件不存在,则发送不存在对应的指令if(errno == ENOENT){if(send(acceptfd, err, strlen(err), 0) < 0){ERR_LOG("fail to send");}close(acceptfd);pthread_exit(NULL);}else{ERR_LOG("fail to open");}}//如果文件存在,先发送指令告知浏览器if(send(acceptfd, head, strlen(head), 0) < 0){ERR_LOG("fail to send");}//读取网页文件中的内容并发送给浏览器ssize_t bytes;char text[1024] = "";while((bytes = read(fd, text, 1024)) > 0){if(send(acceptfd, text, bytes, 0) < 0){ERR_LOG("fail to send");}}pthread_exit(NULL);
}int main(int argc, char const *argv[])
{if(argc < 3){fprintf(stderr, "Usage: %s <server_ip> <server_port>\n", argv[0]);exit(1);}   int sockfd, acceptfd;struct sockaddr_in serveraddr, clientaddr;socklen_t addrlen = sizeof(serveraddr);//第一步:创建套接字if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ERR_LOG("fail to socket");}//将套接字设置为允许重复使用本机地址或者为设置为端口复用int on = 1;if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0){ERR_LOG("fail to setsockopt");}//第二步:填充服务器网络信息结构体serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);serveraddr.sin_port = htons(atoi(argv[2]));//第三步:将套接字与服务器网络信息结构体绑定if(bind(sockfd, (struct sockaddr *)&serveraddr, addrlen) < 0){ERR_LOG("fail to bind");}//第四步:将套接字设置为被动监听状态if(listen(sockfd, 5) < 0){ERR_LOG("fail to listen");}while(1){//第五步:阻塞等待客户端的连接请求if((acceptfd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen)) < 0){ERR_LOG("fail to accept");}//打印客户端的信息printf("%s -- %d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));//创建线程接收数据并处理数据pthread_t thread;if(pthread_create(&thread, NULL, pthread_fun, &acceptfd) != 0){ERR_LOG("fail to pthread_create");}pthread_detach(thread);}return 0;
}

webserver通信过程相关推荐

  1. WCF基础教程(三)——WCF通信过程及配置文件解析

    引言   因为最近事情比较多对wcf的学习也被耽搁了一阵,今天总算是有一点时间,就把前一 段时间学习的内容在这总结一下,当然更重要一个的目的是和大家交流一下,这样才能 学习的更好. 一.WCF的优势 ...

  2. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  3. stm32c8t6的can通信实验代码_TCP的连接建立与关闭状态及数据传输通信过程【含有 PHP socket API 测试实验代码】...

    php中文网最新课程 每日17点准时技术干货分享 本文章使用 PHP 代码来测试 TCP 传输层的一个通信过程.TCP/IP 协议关于该协议的详细内容可自行查阅 <>PHP 的 tcp/u ...

  4. Socket编程(C语言实现)—— AF_INET(典型的TCP/IP四层模型的通信过程),AF_UNIX(本地进程间通信)

    1.AF_INET域与Socket通信 其是典型的TCP/IP四层模型的通信过程. (1)接收方与发送方依赖IP和port来标识,即,将本地socket绑定到对应的IP端口上: (2)发送数据时指定对 ...

  5. 【计算机网络】HTTP 与 HTTPS ( HTTPS 简介 | HTTP 通信过程 )

    文章目录 一.HTTPS 简介 二.HTTP 通信过程 一.HTTPS 简介 HTTPS 协议就是在 HTTP 协议的基础上 , 增加了一个 SSL 外壳 , 对 HTTP 协议进行加密 ; HTTP ...

  6. 【计算机网络】网络层 : 移动 IP 技术 ( 移动节点 | 本地代理 | 外部代理 | 永久地址 | 转交地址 | 移动 IP 通信过程 )

    文章目录 一.移动 IP 技术 简介 二.移动 IP 通信 一.移动 IP 技术 简介 移动 IP 技术 简介 : ① "移动 IP 技术" 概念 : 移动节点 以 固定的网络 I ...

  7. LimeSDR性能参数介绍及如何用它实现通信过程

    1.什么是SDR? SDR (Software Defined Radio),软件定义的无线电. 软件定义无线电(SDR)是一种无线电通信系统,通过软件来实现传统无线电系统中用硬件实现的模块(例如混频 ...

  8. BLE通信过程中,一次连接间隔最多可以发多少包,BLE的最大通信速度为多少

    最大吞吐量(简单了解) 兼容IOS的情况下,20ms间隔,最大通信速率 6KBytes/S,单独安卓为7.5ms间隔时,通信速率为16KBytes/S IOS一个连接间隔最多交互4次: 安卓一个连接间 ...

  9. 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理

    一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...

最新文章

  1. Ubuntu18.04安装g2o,及问题解决_HyperZhu的博客-CSDN博客_ubuntu18.04安装g2o
  2. 一个苏州IT人的5年挨踢经历-------面试篇(之三)
  3. 初探系列 — Pharbers用于单点登录的权限架构
  4. 电源稳定性测试软件,电源测试:电源设计的稳定性测量
  5. 【福利】赠书:Spring Cloud与Docker微服务架构实战(第2版)
  6. 为什么百万医疗险越来越多,到底选哪款?
  7. 招商银行的软件BUG
  8. linux php oci,Linux下PHP连接Oracle数据库
  9. 7-84 点赞狂魔 (25 分)
  10. 码元、波特、速率、带宽
  11. 淘宝SDK easing属性(旋转木马)
  12. 白盒测试实践作业进度报告——Day 3
  13. 上面两点下面一个三角形_【人人都能欣赏的数学证明】为什么三角形的三个内角相加是180度?...
  14. TensorFlow之saved_model使用笔记
  15. 笔记本计算机无法开机,笔记本电脑无法开机黑屏?故障分析大全,及时解决办法...
  16. 一次CNVD-2020-10487漏洞利用
  17. 带掩码的自编码器(MAE)最新的相关论文推荐
  18. 把多个EXCEL文件汇总到一个EXCEL中
  19. Python爬虫学习之路——python IED工具介绍(一)
  20. 解决电脑关机后会自动重启?

热门文章

  1. 判断三个数最大的数 从结果出发思考问题
  2. centos6创建用户,设置ssh登录
  3. android设备局域网中快速搜索之cling方式
  4. ESXi上的固态硬盘识别为非SSD
  5. 一分钟解决idea端口占用问题
  6. Distinct Subsequences
  7. Python学习笔记__4章 函数式编程
  8. linux的/etc/hosts的作用
  9. JAVA-数据库之JDBC连接MySQL数据库
  10. 这里先发布一个,自己写得unityUI的适配的方案(插播)