用libevent实现的发送图片

服务器端的代码:

#include <event2/event.h>

#include <event2/event_compat.h>

#include <event2/event_struct.h>

#include <map>

#include <vector>

#include <string>

#include <iostream>

#ifndef _WIN32

#include <fcntl.h>

#include <netinet/in.h>

#include <unistd.h>

#include <sys/socket.h>

else

#include <winsock2.h>

#include <windows.h>

#include <ioctlsocket.h>

#endif

#include <fstream>

#include "include/json/json.h"

#ifdef _WIN32

#pragma comment(lib,"WS2_32")

#endif

//#include <iostream>

#pragma comment(lib,"json_vc71_libmtd.lib")

#pragma comment(lib,"libevent.lib")

#pragma comment(lib,"libevent_core.lib")

#pragma comment(lib,"libevent_extras.lib")

#include "base64.h"

#define SERVER_PORT 55555

//#define MESSAGE_SIZE 64000

struct client {

struct event ev_read;

};

void on_read(int fd,short ev,void *arg)

{

struct client* client = (struct client*)arg;

std::ifstream file;

file.open("C:/Users/Administrator/Desktop/2.jpg",std::ios_base::in|std::ios_base::binary|std::ios_base::ate);

file.seekg(0,std::ios::end);

char *buffer ;

long size;

size = file.tellg();

buffer = new char [size];

file.seekg(0,std::ios::beg);

file.read (buffer, size);

//std::string pic = buffer;

//std::cout<<pic<<std::endl;

// std::string picture = base64_encode(reinterpret_cast<const unsigned char*>(pic.c_str()), pic.length());

std::string picture = base64_encode(reinterpret_cast<const unsigned char*>(buffer), size);

//std::cout<<picture<<std::endl;

char des[] ="C:/Users/Administrator/Desktop/2.jpg";

char ch = ‘.‘;

std::string str("C:/Users/Administrator/Desktop/2.jpg");

int index=  str.find(ch);

//std::cout<<index<<std::endl;

int length = sizeof(des)-index;

//std::cout<<length<<std::endl;

std::string format = str.substr(index);

//std::cout<<formal<<std::endl;

char sizeStr[9] ;

sprintf(sizeStr,"%d",size);

Json::Value data;

data["content"] = Json::Value(picture);

//data["content"] = Json::Value(buffer);

data["format"] = Json::Value(format);

data["size"] = Json::Value(sizeStr);

Json::FastWriter fast_writer;

std::string res = fast_writer.write(data);

//std::cout<<res<<std::endl;

const char* sbuffer = res.c_str();

int n,nwrite;

long data_size = strlen(sbuffer);

// char*  data_pointer =0;

//int data_array[]={data_size};

//sprintf(data_pointer,"%d",data_size);

//char* data_array=0;

//itoa(data_size,data_array,10);

send(fd,(char*)&data_size,8,0);

std::cout<<data_size<<std::endl;

n = data_size;

while(n>0)

{

nwrite = send(fd,sbuffer+data_size-n,n,0);

if(nwrite < n)

{

/*if(nwrite == -1 && errno != EAGAIN)

{

perror("write error");

}*/

break;

}

n -= nwrite;

}

event_del((struct event*)arg);

closesocket(fd);

/*char world[8] = {0};

recv(fd,world,7,0);

std::cout<<world<<std::endl;*/

delete[]  buffer;

// printf("%s\n",buf);

}

//int

//setnonblock(int fd)

//{

//        int flags;

//

//        flags = fcntl(fd, F_GETFL);

//        if (flags < 0)

//                return flags;

//        flags |= O_NONBLOCK;

//        if (fcntl(fd, F_SETFL, flags) < 0)

//                return -1;

//

//        return 0;

//}

void on_accept(int fd,short ev,void *arg)

{

//printf("jump right!");

int conn_fd;

struct sockaddr_in client_addr;

int client_len = sizeof(client_addr);

struct client *client;

//struct event ev_client;

//接受新的连接

conn_fd = accept(fd,(struct sockaddr*)&client_addr,&client_len);

if (conn_fd == -1)

printf("accept failed!");

client = (struct client*)calloc(1,sizeof(*client));

//client = malloc(sizeof(*client));

if(client == NULL)

printf("malloc failed!");

//

std::cout<<"accept connection"<<std::endl;

//printf(client_fd);

event_set(&client->ev_read,conn_fd,EV_READ|EV_WRITE|EV_PERSIST,on_read,client);

event_add(&client->ev_read,NULL);

printf("accepted connection from %s/n",inet_ntoa(client_addr.sin_addr));

}

void init()

{

WSADATA wsa={0};

WSAStartup(MAKEWORD(2,2),&wsa);

}

void setsocket(int fd,int reuse)

{

/*int listen_fd = fd;

int reuseaddr_on = reuse;

if(setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&reuseaddr_on,sizeof(reuseaddr_on)) == -1)

printf("setsockopt failed");*/

}

#ifdef _Win32

void address(struct sockaddr_in listen_addr)

{

memset(&listen_addr,0,sizeof(listen_addr));

listen_addr.sin_family= AF_INET;

listen_addr.sin_addr.S_un.S_addr=INADDR_ANY;

listen_addr.sin_port = htons(SERVER_PORT);

}

#endif

int main()

{

/*   #ifdef _Win32

init();

#endif*/

init();

int listen_fd;

struct sockaddr_in listen_addr;

int reuseaddr_on = 1;

//接受连接请求的事件对象

struct event ev_accept;

// 初始化libevent

event_init();

listen_fd = socket(AF_INET,SOCK_STREAM,0);

#ifdef _Win32

int nRet;

nRet = ioctlsocket(listen_fd,FIONBIO,&reuseaddr_on);

if(nRet == SOCKET_ERROR)

{

printf("setNonblock error!");

}

#endif

if(listen_fd < 0)

printf("create failed!");

#ifndef _Win32

setsocket(listen_fd,reuseaddr_on);

#else

#endif

#ifndef _Win32

memset(&listen_addr,0,sizeof(listen_addr));

listen_addr.sin_family=AF_INET;

//listen_addr.sin_addr.s_addr= inet_addr("192.168.11.206");

listen_addr.sin_addr.s_addr= INADDR_ANY;

listen_addr.sin_port=htons(SERVER_PORT);

#else

address(listen_adddr);

#endif

/*memset(&listen_addr,0,sizeof(listen_addr));

listen_addr.sin_family= AF_INET;

listen_addr.sin_addr.S_un.S_addr=INADDR_ANY;

listen_addr.sin_port = htons(SERVER_PORT);*/

if(bind(listen_fd,(struct sockaddr*)&listen_addr,sizeof(listen_addr))<0)

printf("bind failed!");

if(listen(listen_fd,5)<0)

printf("failed to listen!");

event_set(&ev_accept,listen_fd,EV_READ|EV_WRITE|EV_PERSIST,on_accept,NULL);

event_add(&ev_accept,NULL);

// 事件循环

event_dispatch();

WSACleanup();

return 0;

}

客户端接收代码:采用json格式   进行base64编码

#include "client.h"

#include "callBack.h"

void client::initSocket()

{

WSADATA wsa={0};

WSAStartup(MAKEWORD(2,2),&wsa);

}

int client::conne(void (*)(int))

{

int client_fd;

struct sockaddr_in client_addr;

client_fd = socket(AF_INET,SOCK_STREAM,0);

if(client_fd < 0)

printf("create failed!");

memset(&client_addr,0,sizeof(client_addr));

client_addr.sin_family= AF_INET;

//client_addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

client_addr.sin_addr.S_un.S_addr=inet_addr("192.168.11.108");

client_addr.sin_port = htons(PORT);

if((connect(client_fd,(SOCKADDR*)&client_addr,sizeof(client_addr)))==SOCKET_ERROR )

{

printf("connect error!");

closesocket(client_fd);

return -1;

}

return client_fd;

}

void client::recev(int client_fd)

{

char length[9]={0};

long tt ;

size_t l = recv(client_fd,(char*)&tt,8,0);

//size_t tt = (int)length;

//cout<<tt<<endl;

char *recvBuf= new char[tt];

int n =0;

int nread= 0;

//while((nread = recv(client_fd,recvBuf+n,BUFSIZE,0))>0)

//{

// n +=nread;

//}

recv(client_fd,recvBuf,tt,0);

std::string picall = recvBuf;

//pthread_t thread;

//if(pthread_create(thread,NULL,thread_func,NULL)!= 0)

//{

// return EXIT_FAILURE;

//}

Json::Reader reader;

Json::Value value;

const char* json_document = picall.c_str();

if(!reader.parse(json_document ,value))

printf("parse error!");

//reader.parse(json_document ,value);

/*std::cout<<value["content"]<<std::endl;

std::cout<<value["format"]<<std::endl;

std::cout<<value["size"]<<std::endl;*/

std::string pic = value["content"].asString();

//int size = value["size"].asInt();

std::string size = value["size"].asString();

const char* area = size.c_str();

int integerSize = atoi(area);

//cout<<size<<endl;

const char* picture = pic.c_str();

std::string coded = base64_decode(pic);

const char* pBuf = coded.c_str();

//写入刚才读取的文件

FILE *pFileOut=fopen("d:/test32.jpg","wb");

fwrite(pBuf,1,integerSize,pFileOut);

// fwrite(picture,1,len,pFileOut);

fclose(pFileOut);

delete[] recvBuf;

}

//void ThreadFunc(PVOID PARAM)

//{

// client ctest;

// ctest.initSocket();

// int client_fd;

// client_fd = ctest.conne(func);

// ctest.recev(client_fd);

// //while(1)

// //{

// // //client_fd = ctest.conne(func);

// //   ctest.recev(client_fd);

// // func(1);

// //}

//}

//int main()

//{

// int i = 0;

// _beginthread(ThreadFunc,0,NULL);

// Sleep(50);

//   // free(pBuf); //释放

// return 0;

//}

int main()

{

client ctest;

ctest.initSocket();

int client_fd;

client_fd = ctest.conne(func);

ctest.recev(client_fd);

func(1);

return 0;

}

功能完全实现,因为CTO不想增加项目大小而没有去优化代码,做完整接口!仅供参考方便日后学习!

用libevent实现的发送图片

时间: 2024-11-05 03:53:57

用libevent实现的发送图片的相关文章

libstrophe发送图片

今天用libstrophe做了一个发送图片的,自己用了三个方法进行实现:感觉可能还是这个最好吧!之前两个CTO不想增加项目大小,被否决.这是用于将windows上的图片发送到ios手机项目中,所以需要自己去实现下.用过libevent.gloox库.下面是libstrophe库的实现. #include <stdio.h> #include <stdlib.h> #include <string.h> #include "base64.h" #inc

在类似qq或者微信聊天中。如何根据不同的手机发送图片

原文:在类似qq或者微信聊天中.如何根据不同的手机发送图片   前一段时间,公司自己要求做多客服开发,但是对于发送图片这一块,当时很苦恼,我用自己的手机(米2)测试,不管是本地,还是云相册,最新照片.都没有问题,但是测试那边一直说图片发不了,而且还会崩.很纳闷.      后来经过debug,发现4.4以上的手机,它的图片路径居然不一样,有file://开头的,也有content://开头的,还有/mnt/sdcard/开头的,坑爹啊,我自己的手机是4.1的,不一样.     4.4以前的路径都

微信企业号:shell定时发送图片 到 指定人

#!/bin/bash #返回access token function getToken(){ #传入参数$1为corpid,参数$2为corpsecret     curl -s "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$1&corpsecret=$2" | awk -F '"' '{print $4}' } #返回media_id function getMediaId(){ #传入参数$1为ac

使用websocket发送图片文件

Websocket是HTML5中的一个传输数据控件. 眼下在主流的浏览器中都提供了支持. 关于websocket的相关协议能够在网上查到,关于怎样建立连接等操作大家能够查询协议获得.本文主要讨论怎样进行传输数据. 在client使用的是Chrome浏览器,在server端使用PHP开发websocket协议. Websocket协议一个frame的标准格式: 0                   1                   2                   3 0 1 2 3

weChat聊天发送图片带有小尖角的实现

weChat聊天发送图片带有小尖角的实现 1.#import <UIKit/UIKit.h>2.3.@interface JKShapeImage : UIView4.5.@property (nonatomic,strong) UIImage *image;6.7.@property (nonatomic,getter=isOnLeft,assign) BOOL onLeft;8.9.@end 1.#import "JKShapeImage.h"2.3.@interfac

H5+MUI+Node.js+Socket.io实现即时聊天以及发送+图片压缩

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <title></title

从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) [转]

从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) ,并在手机页面上显示该图片.(注:本文旨在实现功能,并未考虑效率,有待后续跟进.) 1.服务器端 1 int port=9090; 2 3 4 /** 5 * 发送文件的方法 6 * 此处定义服务器端口为9090,ip地址为192.168.1.1 7 * 设定被传输图片的路径为"images/icon.png" 8 * images文件夹放在此工程的根目录下,我们就可以通过相对路径访问这个图片文件了 9 */ 1

微信 不能发送图片 WeChat1.5.rar

这两天撞见一个很奇葩的问题,升级weixin 2.2版本竟然不能发送图片!!! 解决办法 很笨:退一步海阔天空   !回退半步 卸新的装旧的  so easy ! 想要回退的朋友自行下载 WeChat1.5.rar http://down.51cto.com/data/2249373

php://input解决APP发送图片问题

今天公司要求用APP发送一个图片到PHP程序接收并保存起来,而且中间还需要很多参数! 以前没有做过APP和PHP交互,这次算是一个挑战吧(对一个没有人指导实习生来说) 1.APP发1.jpg,而且带有两个参数一个是假设是X和另外一个假设是Y 2.PHP负责接受X,Y和1.jpg,并且还要保存1.jpg到服务器 步骤: 1.PHP页面代码 $data = file_get_contents(‘php://input’);//这样可以获取到未经处理的原数据(保持发送的图片流不被破坏),在APP上使用