crow
crow和flask都是web框架,能够快速搭建web server服务
#include "crow.h"
int main()
{
crow::SimpleApp app;
CROW_ROUTE(app, "/")([](){
return "Hello world";
});
CROW_ROUTE(app,"/hello/<int>")
([](int count){
if (count > 100)
return crow::response(400);
std::ostringstream os;
os << count << " bottles of beer!";
return crow::response(os.str());
});
CROW_ROUTE(app, "/params")
([](const crow::request& req){
std::ostringstream os;
os << "Params: " << req.url_params << "\n\n";
os << "The key 'foo' was " << (req.url_params.get("foo") == nullptr ? "not " : "") << "found.\n";
if(req.url_params.get("pew") != nullptr) {
double countD = boost::lexical_cast<double>(req.url_params.get("pew"));
os << "The value of 'pew' is " << countD << '\n';
}
auto count = req.url_params.get_list("count");
os << "The key 'count' contains " << count.size() << " value(s).\n";
for(const auto& countVal : count) {
os << " - " << countVal << '\n';
}
return crow::response{os.str()};
});
app.port(18080).multithreaded().run();
}
curl库
#include <stdio.h>
#include <curl/curl.h>
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return false;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");
curl = curl_easy_init(); // 初始化
if (curl)
{
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件
curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
res = curl_easy_perform(curl); // 执行
if (res != 0) {
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
return false;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
int main(void)
{
getUrl("/tmp/get.html");
postUrl("/tmp/post.html");
}
struct curl_httppost* post;
struct curl_httpposr* last;
curl_formadd(&post,&last,CURLFROM_COPYNAME,"image_file",CURLFROM_BUFFER,"data"
,CURLFROM_BUFFERPTR,fram_encoder_str.c_str(),CURLFROM_BUFFERLENGTH,
fram_encoder.length(),CURLFROM_END);
curl_formadd(&post,&last,CURLFROM_COPYNAME,"json_str",CURLFROM_BUFFER
,CURLFROM_COPYCONTENTS,json.dump().c_str(),CURLFROM_END);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data_json);
size_t write_data_json(void* ptr,size_t size ,size_t nmeb,void* stream)
{
std::string data((const char*) ptr,(size_t)size*nmeb);
*(std::stringsream *)stream<<data<<endl;
return size*nmeb;
}
字符乱码解决
int GB2312ToUTF8(char *src,size_t src_len,char *dst,size_t dst_len)
{
iconv_t cd=iconv_open("utf-8//IGNORE","gb2312//IGNORE");
if(0==cd)
return -2;
memset(dst,0,dst_len);
char **temp_src=&src;
char **tem_dst=&dst;
if(-1==(int)iconv(cd,temp_src,&src_len,tem_dst,&dst_len))
return -1;
iconv_close(cd);
return 0;
}
md5计算
#include <iostream>
#include <fstream>
#include <string.h>
#include <openssl/md5.h>
int main(int argc, char *argv[]) {
std::string file_path = "/tmp/test.log";
std::ifstream fin(file_path.c_str(), std::ios::in | std::ios::binary);
if (fin.fail()) {
return -1;
}
unsigned char md5[MD5_DIGEST_LENGTH];
MD5_CTX ctx;
MD5_Init(&ctx);
std::string line;
while(getline(fin, line))
{
MD5_Update(&ctx, line.c_str(), line.size());
}
MD5_Final(md5, &ctx);
std::string md5_hex;
const char map[] = "0123456789abcdef";
for (size_t i = 0; i < MD5_DIGEST_LENGTH; ++i) {
std::cout << int(md5[i]) << " ";
md5_hex += map[md5[i] / 16];
md5_hex += map[md5[i] % 16];
}
std::cout << "\n" << md5_hex << std::endl;
return 0;
}
#include <iostream>
#include <string.h>
#include <openssl/md5.h>
int main(int argc, char *argv[]) {
const char data[] = "1234abcd";
unsigned char md5[MD5_DIGEST_LENGTH];
// 第一种方式
MD5(reinterpret_cast<const unsigned char*>(data), strlen(data), md5); //直接产生字符串的MD5
// 第二种方式
// MD5_CTX ctx;
// MD5_Init(&ctx); //初始化MD5上下文结构
// MD5_Update(&ctx, data, strlen(data)); //刷新MD5,将文件连续数据分片放入进行MD5刷新
// MD5_Final(md5, &ctx); //产生最终的MD5数据
std::string md5_hex;
const char map[] = "0123456789abcdef";
for (size_t i = 0; i < MD5_DIGEST_LENGTH; ++i) {
std::cout << int(md5[i]) << " ";
md5_hex += map[md5[i] / 16];
md5_hex += map[md5[i] % 16];
}
std::cout << "\n" << md5_hex << std::endl;
return 0;
}
decode and encode
#include <iostream>
#include <string>
#include <cstring>
#include "base64.h"
std::string Base64::Encode(const unsigned char * str,int bytes) {
int num = 0,bin = 0,i;
std::string _encode_result;
const unsigned char * current;
current = str;
while(bytes > 2) {
_encode_result += _base64_table[current[0] >> 2];
_encode_result += _base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
_encode_result += _base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
_encode_result += _base64_table[current[2] & 0x3f];
current += 3;
bytes -= 3;
}
if(bytes > 0)
{
_encode_result += _base64_table[current[0] >> 2];
if(bytes%3 == 1) {
_encode_result += _base64_table[(current[0] & 0x03) << 4];
_encode_result += "==";
} else if(bytes%3 == 2) {
_encode_result += _base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
_encode_result += _base64_table[(current[1] & 0x0f) << 2];
_encode_result += "=";
}
}
return _encode_result;
}
std::string Base64::Decode(const char *str,int length) {
//解码表
const char DecodeTable[] =
{
-2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -2, -1, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2,
-2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, -2,
-2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
};
int bin = 0,i=0,pos=0;
std::string _decode_result;
const char *current = str;
char ch;
while( (ch = *current++) != '\0' && length-- > 0 )
{
if (ch == base64_pad) {
if (*current != '=' && (i % 4) == 1) {
return NULL;
}
continue;
}
ch = DecodeTable[ch];
if (ch < 0 ) {
continue;
}
switch(i % 4)
{
case 0:
bin = ch << 2;
break;
case 1:
bin |= ch >> 4;
_decode_result += bin;
bin = ( ch & 0x0f ) << 4;
break;
case 2:
bin |= ch >> 2;
_decode_result += bin;
bin = ( ch & 0x03 ) << 6;
break;
case 3:
bin |= ch;
_decode_result += bin;
break;
}
i++;
}
return _decode_result;
}
#ifndef BASE_64_H
#define BASE_64_H
class Base64{
private:
std::string _base64_table;
static const char base64_pad = '=';public:
Base64()
{
_base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /*这是Base64编码使用的标准字典*/
}
std::string Encode(const unsigned char * str,int bytes);
std::string Decode(const char *str,int bytes);
void Debug(bool open = true);
};
#endif
#include <iostream>
#include "base64.h"
using namespace std;
int main()
{
unsigned char str[] = "这是一条测试数据:http://img.v.cmcm.com/7dd6e6d7-0c2d-5a58-a072-71f828b94cbc_crop_216x150.jpg";
string normal,encoded;
int i,len = sizeof(str)-1;
Base64 *base = new Base64();
encoded = base->Encode(str,len);
cout << "base64 encode : " << encoded << endl;
len = encoded.length();
const char * str2 = encoded.c_str();
normal = base->Decode(str2,len);
cout << "base64 decode : " << normal <<endl;
return 0;
}
#crypto 加密
参考位置