C实现响应浏览器HTTP GET请求上传图片

参考链接:
1.C 实现一个简易的Http服务器
https://www.cnblogs.com/life2refuel/p/5277111.html
2.C++:C语言实现HTTP的GET和POST请求
https://www.cnblogs.com/diligenceday/p/6255788.html

因为工作需要,需要实现在嵌入式设备上响应浏览器的HTPP GET请求,然后将一张图片传输给浏览器。但是不想移植那些开源的软件,一是因为“懒”,二是除此之外没有别的新的需求,所以不想移植软件来增加资源消耗。

在网上查询了下,可以直接用C的方式来实现HTTP GET和POST请求,因此也可以用C直接来响应HTTP GET请求。简单来说,其实就是一套标准的TCP收发流程,创建socket,接收到浏览器发来的GET请求,然后构造相应的数据,然后发送给浏览器即可(当然,上述流程只是针对本文响应GET请求,如果要实现其它功能,流程可能会不同,可以参考上面链接)。

其中,需要关注的是构造数据,在下面的测试程序中,主要构造了发送图片和文字的数据,这个测试程序比较简单,只是响应了HTTP GET请求。

效果:
当在浏览器输入http://192.168.123.100:3333/test/txt时候,浏览器会返回文字,如下
在这里插入图片描述

当在浏览器输入http://192.168.123.100:3333/test/jpg时候,浏览器会返回可执行程序目录下的一张图片,如下
在这里插入图片描述

代码如下:

#include <stdio.h>
#include <sys/types.h>        
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <stdlib.h>
#include <string.h>#define PORT 3333char * sys_os_get_socket_error()
{char * p_estr = NULL;#if __LINUX_OS__p_estr = strerror(errno);#elif __WIN32_OS__int err = WSAGetLastError();static char serr_code_buf[24];sprintf(serr_code_buf, "WSAE-%d", err);p_estr = serr_code_buf;#endifreturn p_estr;
}//创建socket
int socketCreate(int* pFD)
{int val = 1;int reuse_ret;struct sockaddr_in addr;*pFD = socket(AF_INET,SOCK_STREAM,0);if(*pFD <= 0){printf("socketCreate::socket err[%s]!!!\r\n",sys_os_get_socket_error());return -1;}reuse_ret = setsockopt(*pFD, SOL_SOCKET, SO_REUSEADDR, (char *)&val, 4);bzero(&addr,sizeof(struct sockaddr_in));addr.sin_family = AF_INET;addr.sin_addr.s_addr = INADDR_ANY;addr.sin_port = htons(PORT);if(bind(*pFD,(struct sockaddr *)&addr,sizeof(addr)) == -1){printf("bind tcp socket fail, err[%s]!!!\n", sys_os_get_socket_error());close(*pFD);*pFD = 0;return -1;}if(listen(*pFD, 10) < 0){printf("socketCreate::listen tcp socket fail,err[%s]!!!\r\n",sys_os_get_socket_error());close(*pFD);return -1;}return 0;
}//发送图片
int sendPic(int* pFD)
{int fd = *pFD;FILE * fp;int len;char readBuf[600*1024] = {0}; //600kint tlen;char * p_bufs = NULL; /* read data */fp = fopen("./snapshot.jpg", "rb");if (NULL == fp){return -1;}fseek(fp, 0, SEEK_END);len = ftell(fp);if (len <= 0){fclose(fp);return -1;}fseek(fp, 0, SEEK_SET);len = fread(readBuf, 1, len, fp);fclose(fp);/* send data */p_bufs = (char *)malloc(len + 1024);if (NULL == p_bufs){printf("malloc error!\n");return -1;}tlen = sprintf(p_bufs,	"HTTP/1.1 200 OK\r\n""Server: hsoap/2.8\r\n""Content-Type: image/jpeg\r\n""Content-Length: %d\r\n""Connection: close\r\n\r\n",len);memcpy(p_bufs+tlen, readBuf, len);tlen += len;send(fd, p_bufs, tlen, 0);free(p_bufs);return 0;
}//发送文字
int sendTxt(int* pFD)
{int fd = *pFD;int len;//char readBuf[100] = "Just test!"; char readBuf[100] = "<html>\
<head>\<title> 我是标题 </title>\
</head>\
<body>\<p> 测试测试, Just test! <p>\
</body>\
</html>";int tlen;char * p_bufs = NULL; len = strlen(readBuf);/* send data */p_bufs = (char *)malloc(len + 1024);if (NULL == p_bufs){printf("malloc error!\n");return -1;}tlen = sprintf(p_bufs,	"HTTP/1.1 200 OK\r\n""Server: hsoap/2.8\r\n""Content-Type: text/html\r\n""Content-Length: %d\r\n""Connection: close\r\n\r\n",len);memcpy(p_bufs+tlen, readBuf, len);tlen += len;send(fd, p_bufs, tlen, 0);free(p_bufs);return 0;
}//接收数据
int socketRecv(int* pFD)
{int fd = *pFD;fd_set fdr;int sret;struct timeval tv;int cfd;struct sockaddr_in caddr;socklen_t size;int rlen = 0;char rBuf[100*1024] = {0};while(1){FD_ZERO(&fdr);FD_SET(fd, &fdr);tv.tv_sec = 0;tv.tv_usec = 200 * 1000;sret = select((int)(fd+1), &fdr,NULL,NULL,&tv);if (sret == 0){//timeout//return 0;continue;}else if (sret < 0){printf("socketRecv::select err[%s]\r\n", sys_os_get_socket_error());//return -1;continue;}if(FD_ISSET(fd, &fdr)){size = sizeof(struct sockaddr_in);cfd = accept(fd, (struct sockaddr *)&caddr, &size);if(cfd <= 0){printf("socketRecv::accept\r\n");//return -1;continue;}rlen = recv(cfd,rBuf,sizeof(rBuf)-1,0);if(rlen <= 0){continue;}printf("get %d bytes of normal data: %s \n",rlen,rBuf);//解析数据if (strstr(rBuf, "GET /test/jpg")){sendPic(&cfd);}else if (strstr(rBuf, "GET /test/txt")){sendTxt(&cfd);}close(cfd);}}return 0;
}//http://192.168.123.100:3333/test/txt
//http://192.168.123.100:3333/test/jpg
int main()
{int mFD = 0;if (0 != socketCreate(&mFD)){printf("Create Socket Error!\n");return -1;}socketRecv(&mFD);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/70851.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

input file 实现上传预览图片,以base64上传,兼容IE8+,firefox,chrome

前言 最近在公司开发一个项目&#xff0c;其中涉及到一个公能&#xff0c;主要是上传一些小图片&#xff0c;而且在网站上需要大量引用这个小图片的&#xff0c;对于上传一些小的头像等。一开始觉得直接上传就好了&#xff0c;但是发现这样子的话&#xff0c;一个小图片就会发…

关于微信内置浏览器,打开图片上传功能,调用的问题

关于微信内置浏览器&#xff0c;打开图片上传功能&#xff0c;调用的问题 前段时间&#xff0c;项目完结测试的时候&#xff0c;同事打开魅族手机测试&#xff0c;无意中发现一个奇葩的问题&#xff01; 描述&#xff1a; 显示的是文件系统&#xff0c;列表式的&#xff0c;没有…

A-Level化学例题解析及练习

今日知识点&#xff1a;Ionisation energy and valence electrons 例题 The table gives the successive ionisation energies for an element X. What could be the formula of the chloride of X A XCl B XCl2 C XCl3 D XCl4 解析 Answer: C Definition of…

一枚Android 短信小偷 病毒的分析

一、样本简介 样本来自于吾爱破解论坛链接地址为http://www.52pojie.cn/thread-410238-1-1.html&#xff0c;样本不是很复杂有空就分析了一下。Android病毒样本还是很有意思的&#xff0c;有需要分析的样本发到论坛分析分析。 二、样本信息 文件名称&#xff1a;10086.apk …

编程确定小偷

已知A、B、C、D四个人中有一人是小偷&#xff0c;并且&#xff0c;这四个人中每人要么说真话&#xff0c;要么说假话。在审问过程中&#xff0c;这四个人分别回答如下&#xff1a; A说&#xff1a;B没有偷&#xff0c;是D偷的。 B说&#xff1a;我没有偷&#xff0c;是C偷的。 …

【笔记】根据公交卡出行记录识别小偷

案例来源&#xff1a;Bowen Du 案例地址&#xff1a;http://www.kdd.org/kdd2016/papers/files/adf0629-duA.pdf &#xff08;以下为案例的简要概述&#xff0c;便于之后能快速检索到相关内容。部分文字与图片可能直接来自原文&#xff0c;如有侵权请告知&#xff0c;谢谢&…

小偷-守卫博弈:“诡异”的纳什均衡

目录 1.什么是小偷-守卫博弈&#xff1f; 2.用数学刻画博弈信息 3.我是小偷&#xff01; 4.我是守卫&#xff01; 5.尬住了。。。 6.一个感性的认识&#xff08;给参数赋些值&#xff09; 7.纯策略&#xff1f;混合策略&#xff01; 8.混合策略纳什均衡求解 9.结论&am…

C++实现U盘小偷(超详细版)

文章目录 前言一、程序演示二、项目下载三、源代码四、代码解析1.main函数2.RegisterGlobalKey与UnRegistreGlobalKey函数3.DealMsg函数4.FindDriver函数5.ThrToSearch线程搜索函数6.ThrToCopy线程拷贝函数7.FindAllFile函数 前言 对于C/C学习感兴趣的小伙伴&#xff0c;可以看…

一个简单的动态规划问题---小偷案例

Java算法训练—小偷案例 文章目录 Java算法训练---小偷案例 前言一、案例描述二、问题分析三、代码示例总结 前言 动态规划是一种算法技巧&#xff0c;先举一个例子&#xff1a;   如何让一个四岁的小孩理解动态规划的思路&#xff1f;国外友人有这样一个例子&#xff1a;列…

Python编程判断谁是小偷

谁是小偷 ‎小区发生盗窃案&#xff0c;有四个人嫌疑最大&#xff0c;警察找来讯问。‌ ‎A说&#xff1a;不是我。‌ ‎B说&#xff1a;是C。‌ ‎C说&#xff1a;是D。‌ ‎D说&#xff1a;他冤枉人。‌ ‎四人中有一人说了假话&#xff0c;编程分析谁是小偷。 此题主要…

焦耳小偷工作原理分析

当开关闭合&#xff0c;Q1获得基极电流导通&#xff0c;右侧线圈流过电流&#xff0c;由于同名端的关系其在左侧线圈产生的互感电动势上负下正&#xff0c;正反馈使得Q1迅速饱和导通。右侧电流处于饱和状态&#xff0c;感应电动势消失&#xff0c;互感电动势也消失。互感电动势…

c语言四个人中有一个人是小偷,、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话...

、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话 关注:65 答案:5 mip版 解决时间 2021-01-31 07:52 提问者酒瘾渼亽兒 2021-01-30 16:58 、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已…

推理题-谁是小偷?

警察抓住了A、B、C、D四名盗窃嫌疑犯&#xff0c;其中只有一人是小偷。在审问时&#xff0c; A说&#xff1a;“我不是小偷”&#xff1b; B说&#xff1a;“C是小偷”&#xff1b; C说&#xff1a;“小偷肯定是D”&#xff1b; D说&#xff1a;“C在冤枉好人”。 现在已经…

饥荒联机版专用服务器怎么修改小偷包,饥荒联机小偷背包代码 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-08-14 饥荒海难小偷背包获得方法?饥荒失落之船刷小偷背包图文教程,饥荒海难里的小偷背包是格子最多的背包了,相信很多玩家都想拥有,但是小偷背包却不是那么好拿的,今天小编就为大家带来一套饥荒海难刷小偷背包图文教程,希望对大家有所帮助 ... 标签&…

【Multisim仿真】焦耳小偷电路仿真实验

【Multisim仿真】焦耳小偷电路仿真实验 Multisim仿真 本实验仿真平台&#xff1a;Multisim14 基本电路 仿真前的相关设置选项 变压器参数设置主副线圈绕组比例调整比例&#xff1a;10:10 铁芯设置选项&#xff1a; ###对变压器输出绕组端的电压进行瞬态电压进行捕捉 设置…

深度优先遍历算法-01小偷偷东西问题

小偷偷东西问题 前言 深度优先遍历是经典的图论算法&#xff0c;深度优先遍历算法的搜索逻辑和它的名字一样&#xff0c;只要有可能&#xff0c;就尽量深入搜索&#xff0c;直到找到答案&#xff0c;或者尝试了所有可能后确定没有解。简单来说&#xff0c;深度优先遍历就是按照…

百家云在人工智能领域再有新动作,发布应用于多个行业的AIGC解决方案

4月17日消息&#xff0c;音视频SaaS上市公司百家云&#xff08;股票代码&#xff1a;RTC&#xff09;今日宣布&#xff0c;公司将正式推出应用于多个垂直行业及场景的人工智能生成内容及视频解决方案。 百家云总裁马义表示&#xff0c;此次发布的解决方案&#xff0c;将在极短…

可以远程连接服务器,但是无法ping通问题

右键电脑&#xff0c;找到管理 在服务器管理里找到配置项 在配置项里找到 高级安全windows防火墙 在高级安全windows防火墙里&#xff0c;找到&#xff0c;按如下图示&#xff0c;找到“文件和打印机共享&#xff08;回显请求-ICMPv4-in&#xff09;双击。此时图片状态默…

解决连接vcenter (客户端无法向服务器发送完整的请求。(基础连接已经关闭:发送时发生错误。)) 问题...

vCenter版本 5.5 vCenter 安装在server 2008 r2上面&#xff0c;今天补丁一打&#xff0c;重启后就无法连接vcenter了&#xff0c;起初以为是补丁的问题导致vcenter工作不正常&#xff0c;卸载了补丁依旧无法正常连接。 报未知连接错误&#xff0c;&#xff08;客户端无法向服务…

微信提示已连接到服务器失败,微信提示无法连接到服务器如何解决

近来发现不少网友对于微信提示无法连接到服务器如何解决这方面的讯息关注的热度颇高的&#xff0c;那么小编今天就针对此微信提示无法连接到服务器如何解决收集了一些相关的讯息 希望小编收集的这些讯息 能帮助到你。 1、更换接入点,重新连接网络&#xff1a; 2、单击手机上的M…