首页 > 其他分享 >【HTTP】服务器代码<线程>

【HTTP】服务器代码<线程>

时间:2023-12-14 20:22:38浏览次数:34  
标签:HTTP addr int 代码 new sockfd 服务器 sizeof include

  1 #include <stdio.h>
  2 #include <pthread.h>
  3 #include <strings.h>
  4 #include <string.h>
  5 #include <unistd.h>
  6 #include <sys/socket.h>
  7 #include <netinet/in.h>
  8 #include <arpa/inet.h>
  9 #include <sys/types.h>
 10 #include <sys/stat.h>
 11 #include <fcntl.h>
 12 char err[] = "HTTP/1.1 404 Not Found\r\n"
 13              "Content-Type: text/html\r\n"
 14              "\r\n"
 15              "<HTML><BODY>File not found</BODY></HTML>";
 16 char head[] = "HTTP/1.1 200 OK\r\n"
 17               "Content-Type: text/html\r\n"
 18               "\r\n";
 19 // 线程
 20 void *recv_send_fun(void *arg)
 21 {
 22     int sockfd_new = *((int *)arg);
 23     char buf[1024] = "";
 24     char filebuf[1024] = "";
 25     char file[64] = "";
 26     int fd = 0;
 27     int len = 0;
 28     while (1)
 29     {
 30         bzero(buf, sizeof(buf));
 31         bzero(file, sizeof(file));
 32         // 接受浏览器发来的消息
 33         recv(sockfd_new, buf, sizeof(buf), 0);
 34         // 解析浏览器请求文件
 35         sscanf(buf, "GET /%s", file);
 36         fd = open(file, O_RDWR);
 37         if (fd > 0) // 判断文件是否存在
 38         {
 39             send(sockfd_new, head, strlen(head), 0);
 40             while (1)
 41             {
 42                 len = read(fd, filebuf, sizeof(filebuf));
 43                 send(sockfd_new, filebuf, len, 0);
 44                 if (len < 1024)
 45                     break;
 46             }
 47         }
 48         else
 49         {
 50             send(sockfd_new, err, strlen(err), 0);
 51         }
 52     }
 53     return NULL;
 54 }
 55 
 56 int main(int argc, char const *argv[])
 57 {
 58     // 1.创建套接字
 59     int sockfd = socket(AF_INET, SOCK_STREAM, 0);
 60     if (sockfd < 0)
 61     {
 62         perror("socket");
 63         return -1;
 64     }
 65     // 2.端口复用
 66     int yes = 1;
 67     setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes));
 68     // 3.绑定
 69     struct sockaddr_in my_addr;
 70     my_addr.sin_family = AF_INET;
 71     my_addr.sin_port = htons(8000);
 72     my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 73     int ret = bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr));
 74     if (ret != 0)
 75     {
 76         perror("bind");
 77         return -1;
 78     }
 79     // 4.监听
 80     listen(sockfd, 10);
 81 
 82     struct sockaddr_in cli_addr;
 83     int len = sizeof(cli_addr);
 84     char ip[16] = "";
 85     unsigned short port = 0;
 86     int sockfd_new = 0;
 87     while (1)
 88     {
 89         // 5.保证提取到了正确的客户端
 90         sockfd_new = accept(sockfd, (struct sockaddr *)&cli_addr, &len);
 91         if (sockfd_new < 0)
 92             continue;
 93         // 6.创建线程
 94         pthread_t pth;
 95         pthread_create(&pth, NULL, recv_send_fun, (void *)&sockfd_new);
 96         pthread_detach(pth);
 97     }
 98     // 8.关闭套接字
 99     close(sockfd);
100     close(sockfd_new);
101     return 0;
102 }

 

标签:HTTP,addr,int,代码,new,sockfd,服务器,sizeof,include
From: https://www.cnblogs.com/mengyaoli/p/17901927.html

相关文章

  • Python——了解Html+Css语言代码
    HTML(HyperTextMarkupLanguage超文本标记语言)用特殊的一种标签把需要特殊展示出来的内容圈起来。这就是标记语言语法规则<标记>被标记的内容</标记><标记/>巨大的坑。在以前2000年左右。那个时候语法规则不够规范。有些人写HTML的时候习惯性的漏掉括回文本:文字,字符串,符号。超......
  • SixLabors.ImageSharp 圆角矩形路径代码
    原因因微软抛弃了System.Drawing.Common决定重写绘图底层,在学习绘制时常会用到部分绘图引擎,参考过几个都有缺陷例如:1.SkiaSharp字体布局问题参考布局问题2.opencvsharp不支持中文文字于是乎我就用到了imageSharp,其中看到作者有对于圆角矩形头像的示例代码,但这......
  • 服务器日记
    查看玩法:自己拥有一台服务器可以做哪些很酷的事情?-知乎(zhihu.com)  自己拥有一台服务器可以做哪些很酷的事情?-知乎(zhihu.com)搜索监控服务器:netdata监控服务器_百度搜索(baidu.com)查看教程:65.7kStar!强大又全面的性能监控工具——Netdata-知乎(zhihu.com)查看......
  • Python多线程计算的方法及示例代码
    Python是一种非常流行的编程语言,支持多种并发编程的方式,其中包括多线程。多线程允许程序同时执行多个任务,从而提高了程序的运行效率。下面将介绍Python中多线程计算的几种常见方法,并给出具体的示例代码。方法一:使用标准库threadingPython标准库中提供了threading模块,通过创建Thread......
  • vscode格式化代码
    第一步:安装三个插件:​​Prettier-Codeformatter​​​、​​ESLint​​​、​​Vetur​​。第二步:修改配置文件MacOS使用​​Command+Sheft+P​​​,windows使用​​Ctrl+Sheft+P​​搜索首选项:打开设置(json),然后把下面配置粘贴进去:Preferences:OpenW......
  • Istio从入门到精通—— 流量治理的原理 —— VirutalService —— HTTPRouteDestinati
     流量治理的原理——VirutalService——HTTPRouteDestinationhttps://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPRouteDestination Eachroutingruleisassociatedwithoneormoreserviceversions(seeglossaryinbeginning......
  • 服务器数据恢复-raid5多块磁盘掉线导致上层卷无法挂载,oracle数据库不可用的数据恢复案
    服务器数据恢复环境:一台服务器中有一组由24块FC硬盘组建的raid5磁盘阵列,linux操作系统+ext3文件系统,服务器上层部署有oracle数据库。服务器故障&检测:raid5阵列中有两块硬盘出现故障掉线,导致服务器上层卷无法挂载,oracle数据库无法正常使用。通过管理后台查看服务器中硬盘的状态,......
  • Charles导入功能实现 代码说明
    需要用的的包:haralyzer主要目的:解析har文件下载包命令:pip3installharalyzerfromharalyzerimportHarParser,HarPagefromurllib.parseimporturlparse,urlunparseimportjsonimportloggingimportrequestsimportreimportoslogger=logging.getLogger('......
  • php底层代码执行流程
    PHP在底层(C语言层面)的代码执行流程可以大致分为以下几个步骤:解析器初始化:当PHP服务启动时,会调用解析器(ZendEngine)的初始化函数进行初始化,包括各种全局变量的初始化,内存池的初始化。文件读取和解析:解析器会读取并解析PHP文件,将其转换为语法树,并将其中的函数和变量信息保......
  • 浪潮信息云峦服务器操作系统KeyarchOS体验与实践
    写在前面大家好我是网络豆,一名云计算运维人员,本文将会带大家体验一下浪潮信息服务器操作系统云峦KeyarchOS。看看浪潮信息服务器操作系统云峦KeyarchOS的优势与实践操作如何。背景了解KeyarchOS是浪潮信息基于LinuxKernel、OpenAnolis等开源技术自主研发的一款服务器操作系统,支持x......