Optimize YAsioTest, see #150

This commit is contained in:
halx99 2020-08-10 00:20:29 +08:00
parent a72a75886d
commit adc97af519
1 changed files with 69 additions and 100 deletions

View File

@ -31,41 +31,29 @@
#include "yasio/obstream.hpp" #include "yasio/obstream.hpp"
#include "yasio/yasio.hpp" #include "yasio/yasio.hpp"
#include "yasio/platform/yasio_jni.cpp" #include "yasio/platform/yasio_jni.cpp"
#include "base/SimpleTimer.h"
USING_NS_CC; USING_NS_CC;
using namespace yasio; using namespace yasio;
using namespace yasio::inet; using namespace yasio::inet;
void yasioTest() class YNSM{
public:
static YNSM* getInstance() {
static YNSM s_nsm;
return &s_nsm;
}
YNSM() : _service(1) // 1 channel
{ {
yasio::inet::io_hostent endpoints[] = { {"github.com", 443} }; yasio::inet::io_hostent endpoints[] = { {"github.com", 443} };
_service.start([&](event_ptr&& event) {
io_service service(endpoints, 1);
resolv_fn_t resolv = [&](std::vector<ip::endpoint>& endpoints, const char* hostname,
unsigned short port) {
return service.builtin_resolv(endpoints, hostname, port);
};
service.set_option(YOPT_S_RESOLV_FN, &resolv);
std::vector<transport_handle_t> transports;
deadline_timer udpconn_delay(service);
deadline_timer udp_heartbeat(service);
int total_bytes_transferred = 0;
int max_request_count = 3;
std::string respRawData;
std::string finalMessage;
service.start_service([&](event_ptr&& event) {
switch (event->kind()) switch (event->kind())
{ {
case YEK_PACKET: { case YEK_PACKET: {
auto packet = std::move(event->packet()); auto packet = std::move(event->packet());
total_bytes_transferred += static_cast<int>(packet.size()); _respRawData.insert(_respRawData.end(), packet.begin(), packet.end());
respRawData.insert(respRawData.end(), packet.begin(), packet.end());
break; break;
} }
case YEK_CONNECT_RESPONSE: case YEK_CONNECT_RESPONSE:
@ -85,52 +73,46 @@ void yasioTest()
obs.write_bytes("Accept: */*;q=0.8\r\n"); obs.write_bytes("Accept: */*;q=0.8\r\n");
obs.write_bytes("Connection: Close\r\n\r\n"); obs.write_bytes("Connection: Close\r\n\r\n");
service.write(transport, std::move(obs.buffer())); _service.write(transport, std::move(obs.buffer()));
} }
transports.push_back(transport);
} }
break; break;
case YEK_CONNECTION_LOST: case YEK_CONNECTION_LOST:
cocos2d::log("yasio-ssl recv data: %s\n---> %d bytes transferred", respRawData.c_str(), total_bytes_transferred); cocos2d::log("yasio-ssl recv data: %s\n---> %d bytes transferred", _respRawData.c_str(), _respRawData.size());
respRawData.clear(); _respRawData.clear();
total_bytes_transferred = 0;
if (--max_request_count > 0)
{
udpconn_delay.expires_from_now(std::chrono::seconds(1));
udpconn_delay.async_wait_once([&]() { service.open(0, YCK_SSL_CLIENT); });
}
else
service.stop_service();
break; break;
} }
}); });
_timerId = stimer::loop(0x7fffffff, 0, [=](){
_service.dispatch(128);
});
}
~YNSM(){
stimer::kill(_timerId); // don't like any network event
_service.stop(); // stop network service thread
}
// just test
void openHttpsConnection(){
/* /*
** If after 5 seconds no data interaction at application layer, ** If after 5 seconds no data interaction at application layer,
** send a heartbeat per 10 seconds when no response, try 2 times ** send a heartbeat per 10 seconds when no response, try 2 times
** if no response, then he connection will shutdown by driver. ** if no response, then he connection will shutdown by driver.
** At windows will close with error: 10054 ** At windows will close with error: 10054
*/ */
service.set_option(YOPT_S_TCP_KEEPALIVE, 5, 10, 2); _service.set_option(YOPT_S_TCP_KEEPALIVE, 5, 10, 2);
service.open(0, YCK_SSL_CLIENT); // open http client _service.set_option(YOPT_C_REMOTE_ENDPOINT, 0, "github.com", 443);
_respRawData.clear();
_service.open(0, YCK_SSL_CLIENT); // open http client
}
time_t duration = 0; io_service _service;
while (service.is_running()) stimer::TIMER_ID _timerId;
{ std::string _respRawData;
service.dispatch(); };
if (duration >= 6000000)
{
for (auto transport : transports)
service.close(transport);
break;
}
duration += 50;
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
}
YAsioTests::YAsioTests() YAsioTests::YAsioTests()
{ {
@ -155,23 +137,10 @@ YAsioTest::YAsioTest()
_label->retain(); _label->retain();
} }
// the test code is
// https://github.com/simdsoft/yasio/blob/master/tests/ssl/main.cpp
void YAsioTest::onTouchesEnded(const std::vector<Touch*>& touches, Event *event) void YAsioTest::onTouchesEnded(const std::vector<Touch*>& touches, Event *event)
{ {
std::thread t([=] { YNSM::getInstance()->openHttpsConnection();
Director::getInstance()->getScheduler()->performFunctionInCocosThread([=] {
_label->setString("Starting yasio https request test, see the output!"); _label->setString("Starting yasio https request test, see the output!");
});
yasioTest();
Director::getInstance()->getScheduler()->performFunctionInCocosThread([=] {
_label->setString("See the output!");
});
});
t.detach();
} }
YAsioTest::~YAsioTest() YAsioTest::~YAsioTest()