mirror of https://github.com/axmolengine/axmol.git
Optimize YAsioTest, see #150
This commit is contained in:
parent
a72a75886d
commit
adc97af519
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue