当前位置: 首页 > news >正文

嵌入式开发学习———Linux环境下网络编程学习(六)

#include "server.h"void mywait(int signm)
{while(1){waitpid(-1,NULL,WNOHANG);}
}int main(int argc, const char *argv[])
{signal(SIGCHLD,mywait);int myport=80;if(argc>1){myport=atoi(argv[1]);}//服务器套接字初始化函数int sfd=serverSocket(myport);struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){//等待连接int nwe_sfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(nwe_sfd==-1);{ERROR_MSG("accept error:");}pid_t pid=fork();if(pid>0){close(nwe_sfd);}else if (pid==0){char buf[1024]="";int len=getLine(nwe_sfd,buf);int k=0,i;char ask[32]="";for(i=0;i<len;i++){if(isspace(buf[i])){break;}ask[k++]=buf[i]; } ask[k]='\0';while(isspace(buf[i]) && i<1023){   i++;}if(strcasecmp(ask,"GET")!=0 && strcasecmp(ask,"POST")!=0){printf("ask error");close(nwe_sfd);exit(EXIT_FAILURE);}if(strcasecmp(ask,"GET")==0){/*GET请求处理*/int k=0;char path[128]="";for(i;i<len;i++){if(isspace(buf[i])){break;}path[k++]=buf[i]; } path[k]='\0';while(isspace(buf[i]) && i<1023){   i++;}if (strcmp(path, "/") == 0) {strcpy(path, "www/index.html");  // 默认首页} else {snprintf(path, sizeof(path), "www%s", path);  // 拼接路径}// 返回文件或错误FILE* file = fopen(path, "rb");if (!file) {send_error(nwe_sfd, 404, "Not Found");  // 文件不存在[1](@ref)return -1;}//发送文件内容fseek(file, 0, SEEK_END);long size = ftell(file);rewind(file);char header[512];snprintf(header, sizeof(header),  // 构造响应头"HTTP/1.1 200 OK\r\n""Content-Type: %s\r\n""Content-Length: %ld\r\n\r\n",get_mime_type(path), size);  send(nwe_sfd, header, strlen(header), 0);//零拷贝发送文件内容(高效)int fd = fileno(file);sendfile(nwe_sfd, fd, NULL, size); fclose(file);}if(strcasecmp(ask,"POST")==0){/*POST请求处理*/}close(nwe_sfd);exit(EXIT_FAILURE);}}return 0;
}

http://www.xdnf.cn/news/1361593.html

相关文章:

  • MySQL 行转列与列转行的实现方式
  • 在新塘SDK下面,有四中文件夹,GCC、IAR、KEIL、和Keil_AC6.这4个工程有什么区别。各自是怎样配置寄存器并实现SPI功能的
  • Aligning Effective Tokens with Video Anomaly in Large Language Models
  • Node.js面试题及详细答案120题(43-55) -- 性能优化与内存管理篇
  • 《飞算Java开发实战:从入门安装到项目部署》
  • 【GEE+Python 实战】用 Sentinel-2 监测 2024 年研究区 NDVI 变化(附完整源码与避坑指南)
  • Codejock Suite ProActiveX COM Crack
  • 一文掌握 Java 键盘输入:从入门到高阶(含完整示例与避坑指南)
  • LIANA | part1 intro部分
  • VMware Workstation 不可恢复错误:(vcpu-0)
  • 详细的周任务清单(Week1-Week24,每周具体目标+任务)
  • Socket some functions
  • 基于PHP服装租赁管理系统/基于php的服装管理系统的设计与实现
  • C#_gRPC
  • 【图像处理基石】基于 Python 的图像行人删除技术:实现街景无干扰化处理
  • 6.1Element UI布局容器
  • leetcode 162 寻找峰值
  • Polkadot - JAM
  • 13种常见机器学习算法总结
  • 青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)
  • 学习制作记录(选项UI以及存档系统)8.24
  • 基于RISC-V架构的国产MCU在eVTOL领域的应用研究与挑战分析
  • 【Ollama】本地OCR
  • 波兰密码破译机bomba:二战密码战的隐形功臣
  • Shell 循环实战:while 与 until 的趣味编程之旅
  • 3.4 磁盘存储器 (答案见原书 P194)
  • 【重学MySQL】八十八、8.0版本核心新特性全解析
  • Unity的Cursor.lockState
  • DeepSeek对采用nginx实现透传以解决OpenShift 4.x 私有数据中心和公有云混合部署一套集群的解答
  • 【SBP】Unity 打包构建管线原理解析于对比