首页 > 其他分享 >用libevent实现的发送图片

用libevent实现的发送图片

时间:2022-12-23 17:56:24浏览次数:37  
标签:std addr int 发送 client fd libevent listen 图片

服务器端的代码:

#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不想增加项目大小而没有去优化代码,做完整接口!仅供参考方便日后学习!
————————————————
版权声明:本文为CSDN博主「一直在路上25」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fuyuehua22/article/details/38587707

标签:std,addr,int,发送,client,fd,libevent,listen,图片
From: https://www.cnblogs.com/kn-zheng/p/17001245.html

相关文章

  • Libevent使用例子,从简单到复杂
    本文从简单到复杂,展示如何使用libevent。网上的许多例子都是只有服务器端的,本文里面客户端和服务器端都有,以飨读者。     关于libevent编程时的一些疑问可以阅读......
  • 成品直播源码,实例源码系列-更改图片透明度
    成品直播源码,实例源码系列-更改图片透明度 partialclassForm1{  ///<summary>  ///必需的设计器变量。  ///</summary>  privateSystem.Componen......
  • 爬天极网美女图片缩略图:
    importos#导入发送请求模块:importrequests#导入解析文本模块:frombs4importBeautifulSoup#返回上一级目录:base_path=os.path.dirname(os.path.abspath(__file__))#路......
  • 爬4k美女图片也很简单:
    importosimportreimportrequestsfromurllibimportrequestfrombs4importBeautifulSoupdirName='./美女图片'ifnotos.path.exists(dirName):os.mkdir(dirNam......
  • 再来爬取4K美女图片
    importrequestsimportosfromlxmlimportetreedirName="./4kmeimv"ifnotos.path.exists(dirName):os.mkdir(dirName)url="http://pic.netbian.com/4kmeinv/ind......
  • 自动邮件发送系统_manok_新浪博客
        这几天,财务部门有这样一个需求,就是200多个员工的工资,放在一个excel文件中,财务人员要复制每个员工的工资到一个单独文件中,再通过附件的形式发送给员工。我想就......
  • 基于.NetCore开发博客项目 StarBlog - (25) 图片接口与文件上传
    前言上传文件的接口设计有两种风格,一种是整个项目只设置一个接口用来上传,然后其他需要用到文件的地方,都只存一个引用ID;另一种是每个需要文件的地方单独管理各自的文件。这......
  • 图片库
         ......
  • 用JAVA发送含有附件的邮件
    1、用JAVA发送含有附件的邮件publicvoidsendKREmailAndFile(String[]toEmail,StringmailSubject,StringmailContent,List<File>fileList)throwsMessagingExcep......
  • PPT 用图片轻松做出高大上的精修
    PPT用图片轻松做出高大上的精修图片留白充分图片很花文字和图片中间,插入一个透明背景单图片型放大+色块左右分割上下分割用一个容器图形......