C++实现HTTP服务器 给浏览器传输图片 显示问题

感觉被秀了 2017-07-22 10:10:38
C++实现HTTP服务器 图片怎么返回给浏览器呢? html已经实现了 图片的每次都是损坏
协议是怎么样的?
同样的问题 该怎么解决啊?
http://bbs.csdn.net/topics/390424550
...全文
3766 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ygfjl 2017-10-21
  • 打赏
  • 举报
回复
楼主怎么解决的啊,可以分享一下么,不胜感激
赵4老师 2017-07-24
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
感觉被秀了 2017-07-22
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
http://www.cnblogs.com/gongxijun/p/4777052.html
谢谢
ipqtjmqj 2017-07-22
  • 打赏
  • 举报
回复
60行,strlen也不能用,自己统计一个有多少个字节 应该就是stream.tellp()+ size 另外既然是c++,你可以不用字符数组,用std::string, std::string中可以存'\0', 可以用append方法,指定大小,size()方法得到字节数
感觉被秀了 2017-07-22
  • 打赏
  • 举报
回复
引用 6 楼 zgl7903 的回复:
http://www.cnblogs.com/gongxijun/p/4777052.html
引用 5 楼 ipqtjmqj 的回复:
因为c语言中的字符串是以'\0'结尾的,图片是二进制,里面可能正好有个字节是0, 改成memcpy(szResponse + stream.tellp(), buff, size);
谢谢 已经可以了 !最后send哪里 不能用strlen 估计也是同样的问题
感觉被秀了 2017-07-22
  • 打赏
  • 举报
回复
引用 5 楼 ipqtjmqj 的回复:
因为c语言中的字符串是以'\0'结尾的,图片是二进制,里面可能正好有个字节是0, 改成memcpy(szResponse + stream.tellp(), buff, size);
嗯嗯 首先谢谢 已经改了。但是依然访问图片 显示 结果存在错误 无法显示。
zgl7903 2017-07-22
  • 打赏
  • 举报
回复
http://www.cnblogs.com/gongxijun/p/4777052.html
ipqtjmqj 2017-07-22
  • 打赏
  • 举报
回复
因为c语言中的字符串是以'\0'结尾的,图片是二进制,里面可能正好有个字节是0, 改成memcpy(szResponse + stream.tellp(), buff, size);
ipqtjmqj 2017-07-22
  • 打赏
  • 举报
回复
39行错了,不能用strcat,改用memcpy
感觉被秀了 2017-07-22
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
把你的代码贴出来
感觉被秀了 2017-07-22
  • 打赏
  • 举报
回复

				FILE * fstream = fopen(FileList[i].fileurl.c_str(), "rb");
				if ( NULL == fstream )  
				{  
					closesocket(ClientSocket);					
					return 0;  
				}  
				fseek(fstream, 0L, SEEK_END);
				long size = ftell(fstream);
				fclose(fstream);
				
				std::stringstream stream;
				stream << "HTTP/1.1 200 OK\r\n";
				stream << "Server: Apache-Coyote/1.1\r\n";
				stream << "Accept-Ranges: bytes\r\n";
				stream << "ETag: W/\"68789-1493185830000\r\n";
				stream << "Last-Modified: Wed, 26 Apr 2017 05:50:30 GMT\r\n";
				stream  <<"Content-Type: image/png\r\n";
				stream << "Content-Length:" << size<<"\r\n";
				stream << "Date: Fri, 21 Jul 2017 07:45:45 GMT\r\n\r\n";			

				char szResponse[204800];
				memset(szResponse,0,204800);
				stream.read(szResponse,stream.tellp());			

				char temp[512];  
				char buff[409600];
				memset(buff,0,409600);
				int ich = 0;
				int j = 0;

				FILE * fp = fopen(FileList[i].fileurl.c_str(), "rb");

				while((ich = getc(fp))!= EOF)
				{
					buff[j++] = ich;
				}				
				fclose(fp);

				strcat(szResponse,buff);
	
				const int bufferSize = 1024;
				char buffer[bufferSize] = {0};
				streamsize readLen = 0;
			
				ifstream srcFile;
				srcFile.open(FileList[i].fileurl.c_str(), ios::binary);
				if (!srcFile)
				{
					return 0 ;
				}

				while (!srcFile.eof())
				{
					srcFile.read(buffer, bufferSize);
					readLen = srcFile.gcount();				
				}

				srcFile.close();
			
			    send(ClientSocket,szResponse,strlen(szResponse),0);		
		
				closesocket(ClientSocket);
ipqtjmqj 2017-07-22
  • 打赏
  • 举报
回复
把你的代码贴出来

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧