#pragma once //#include "mongoose.h" #include "Axiomclient.h" unsigned long GetTimetmp() { unsigned long stampNow = 0; time_t timer; timer = time(NULL); stampNow = timer; return stampNow; } static void event_handle(struct mg_connection* connection, int event_type, void* event_data, void* pUser) { struct http_message* hm = (struct http_message*)event_data; int connect_status; switch (event_type) { case MG_EV_CONNECT: { connect_status = *(int*)event_data; if (connect_status != 0) { char char_tmp[64] = { 0 }; sprintf(char_tmp, "{\"connect failed, error code: %u\":%u}", connect_status); string* str_tmp = (string*)pUser; *str_tmp = char_tmp; } } break; case MG_EV_HTTP_REPLY: { // connection->flags |= MG_F_SEND_AND_CLOSE; string* str_tmp = (string*)pUser; *str_tmp = string(hm->body.p, hm->body.len); } break; case MG_EV_CLOSE: break; case MG_EV_HTTP_CHUNK: break; default: break; } } static void event_handlelong(struct mg_connection* connection, int event_type, void* event_data, void* pUser) { struct http_message* hm = (struct http_message*)event_data; int connect_status; // if (string(hm->body.p, hm->body.len).find(":[]")) {sleep(1000000);} switch (event_type) { case MG_EV_CONNECT: { connect_status = *(int*)event_data; if (connect_status != 0) { char char_tmp[64] = { 0 }; sprintf(char_tmp, "{abcdefg, error code}"); string* str_tmp = (string*)pUser; *str_tmp = char_tmp; } } break; case MG_EV_HTTP_REPLY: { // connection->flags |= MG_F_SEND_AND_CLOSE; string* str_tmp = (string*)pUser; *str_tmp = string(hm->body.p, hm->body.len); // *str_tmp = string(connection->recv_mbuf.buf, connection->recv_mbuf.len); } break; case MG_EV_CLOSE: { char char_tmp[64] = { 0 }; sprintf(char_tmp, "{abcdefg, error code}"); string* str_tmp = (string*)pUser; *str_tmp = char_tmp; } break; case MG_EV_HTTP_CHUNK: break; default: break; } } int Fclient::Sendreq(string& sendUrl, string& sendHeader, string& reqData, string& req_callback, int type) { int flag = 0; //返回-1代表通信失败, 0表示超时, 1代表正常接收数据 string str_url = sendUrl; struct mg_mgr mgr = { 0 }; struct mg_connection* nc = NULL; mg_mgr_init(&mgr, NULL); switch (type) //type 1:post or get 2:delete 3:put 4:post { case 1: nc = mg_connect_http(&mgr, event_handle, &req_callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; case 2: nc = mg_connect_http(&mgr, event_handle, &req_callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; case 3: nc = mg_connect_httpPUT(&mgr, event_handle, &req_callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; case 4: nc = mg_connect_httpPOST(&mgr, event_handle, &req_callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; default: nc = mg_connect_http(&mgr, event_handle, &req_callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; } mg_set_protocol_http_websocket(nc); unsigned long preTime = 0, nowTime = 0; preTime = GetTimetmp(); int findResult = -1; while (1) { if (req_callback.length() > 0) { findResult = -1; findResult = req_callback.find("connect failed, error code"); if (findResult < 0) flag = 1;//Rx ok ret=1 else return -1;// -1 = Socket Error break; } mg_mgr_poll(&mgr, 1000); nowTime = GetTimetmp(); if (nowTime - preTime >= 15) { flag = 0; break; } } mg_mgr_free(&mgr); // if (type == 2) sleep(10000000); return flag; } void Fclient::init_mg() { this->mgr_long = { 0 }; this->nc_long = NULL; mg_mgr_init(&this->mgr_long, NULL); } void Fclient::free_mg() { mg_mgr_free(&this->mgr_long); } int Fclient::SendreqLong(string& sendUrl, string& sendHeader, string& reqData, int type, bool& flag1, string path, string host) { int flag = 0; //返回-1代表通信失败, 0表示超时, 1代表正常接收数据 string str_url = sendUrl; string callback; switch (type) //type 1:post or get 2:delete 3:put 4:post { case 1: if (flag1) { nc_long = mg_connect_http(&mgr_long, event_handlelong, &callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); // nc_long = mg_connect_ws(&mgr_long, host.c_str(), event_handlelong, &call_back); flag1 = false; } else { // sleep(1000000); mg_printf(nc_long, "%s %s HTTP/1.1\r\nHost: %s\r\nContent-Length: %" SIZE_T_FMT "\r\n%s\r\n%s", (reqData[0] == '\0' ? "GET" : "POST"), path.c_str(), host.c_str(), reqData.length(), sendHeader.c_str(), reqData.c_str()); // sleep(100000000); nc_long->mgr = &mgr_long; } break; case 2:{ mg_printf(mgr_long.active_connections, "%s %s HTTP/1.1\r\nHost: %s\r\nContent-Length: %" SIZE_T_FMT "\r\n%s\r\n%s", (reqData[0] == '\0' ? "GET" : "POST"), path.c_str(), host.c_str(), reqData.length(), sendHeader.c_str(), reqData.c_str()); break; } case 3: nc_long = mg_connect_httpPUT(&mgr_long, event_handle, &callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; case 4: nc_long = mg_connect_httpPOST(&mgr_long, event_handle, &callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; default: nc_long = mg_connect_http(&mgr_long, event_handle, &callback, str_url.c_str(), sendHeader.c_str(), reqData.c_str()); break; } // mg_set_protocol_http_websocket(mgr_long.active_connections); unsigned long preTime = 0, nowTime = 0; preTime = GetTimetmp(); int findResult = -1; // int aaaaaaa = 0; while (1) { if (callback.length() > 0) { findResult = -1; findResult = callback.find("abcdefg"); if (findResult < 0) flag = 1;//Rx ok ret=1 else return -1;// -1 = Socket Error break; } // aaaaaaa++; mg_mgr_poll(nc_long->mgr, 1000); // if (type == 2 && aaaaaaa == 2) {sleep(1000000);} // if (!flag1) { sleep(1000000); } // if (iii == 555) { sleep(10000000); } nowTime = GetTimetmp(); if (nowTime - preTime >= 15) { flag = 0; break; } } // mg_mgr_free(&mgr_long); call_back = callback; return flag; }