@@ -40,110 +40,128 @@ ASIO Usage(Client Program):
4040using namespace purelib::inet;
4141
4242template <size_t _Size>
43- void append_string(std::vector<char> &packet, const char(&message)[_Size]) {
44- packet.insert(packet.end(), message, message + _Size - 1);
43+ void append_string(std::vector<char> &packet, const char (&message)[_Size]) {
44+ packet.insert(packet.end(), message, message + _Size - 1);
4545}
4646
4747int main(int, char **) {
4848
49- purelib::inet::channel_endpoint endpoints[] = {
50- { "www.ip138.com ", 80 }, // http client
51- {"0.0.0.0 ", 56981 }, // tcp server
52- };
53- myasio->start_service(endpoints, _ARRAYSIZE(endpoints));
49+ purelib::inet::channel_endpoint endpoints[] = {
50+ {"203.162.71.67 ", 80}, // http client
51+ {"www.ip138.com", 80} // { "www.ip138.com ", 80 }, // http client
52+ };
53+ myasio->start_service(endpoints, _ARRAYSIZE(endpoints));
5454
55- deadline_timer t0(*myasio);
55+ deadline_timer t0(*myasio);
5656
57- t0.expires_from_now(std::chrono::seconds(3));
58- t0.async_wait([](bool) { // called at network thread
59- printf("the timer is expired\n");
60- });
57+ t0.expires_from_now(std::chrono::seconds(3));
58+ t0.async_wait([](bool) { // called at network thread
59+ printf("the timer is expired\n");
60+ });
6161
62- std::vector<std::shared_ptr<channel_transport>> transports;
62+ std::vector<std::shared_ptr<channel_transport>> transports;
6363
64- myasio->set_callbacks(
65- [](char *data, size_t datalen, int &len) { // decode pdu length func
64+ myasio->set_callbacks(
65+ [](char *data, size_t datalen, int &len) { // decode pdu length func
6666 if (datalen >= 4 && data[datalen - 1] == '\n' &&
6767 data[datalen - 2] == '\r' && data[datalen - 3] == '\n' &&
6868 data[datalen - 4] == '\r') {
69- len = datalen;
70- }
71- else {
72- data[datalen] = '\0';
73- auto ptr = strcasestr(data, "Content-Length:");
74-
75- if (ptr != nullptr) {
76- ptr += (sizeof("Content-Length:") - 1);
77- if (static_cast<int>(ptr - data) < static_cast<int>(datalen)) {
78- while (static_cast<int>(ptr - data) < static_cast<int>(datalen) &&
79- !isdigit(*ptr))
80- ++ptr;
81- if (isdigit(*ptr)) {
82- int bodylen = static_cast<int>(strtol(ptr, nullptr, 10));
83- if (bodylen > 0) {
84- ptr = strstr(ptr, "\r\n\r\n");
85- if (ptr != nullptr) {
86- ptr += (sizeof("\r\n\r\n") - 1);
87- len = bodylen + (ptr - data);
88- }
89- }
90- }
69+ len = datalen;
70+ } else {
71+ data[datalen] = '\0';
72+ auto ptr = strcasestr(data, "Content-Length:");
73+
74+ if (ptr != nullptr) {
75+ ptr += (sizeof("Content-Length:") - 1);
76+ if (static_cast<int>(ptr - data) < static_cast<int>(datalen)) {
77+ while (static_cast<int>(ptr - data) < static_cast<int>(datalen) &&
78+ !isdigit(*ptr))
79+ ++ptr;
80+ if (isdigit(*ptr)) {
81+ int bodylen = static_cast<int>(strtol(ptr, nullptr, 10));
82+ if (bodylen > 0) {
83+ ptr = strstr(ptr, "\r\n\r\n");
84+ if (ptr != nullptr) {
85+ ptr += (sizeof("\r\n\r\n") - 1);
86+ len = bodylen + (ptr - data);
87+ }
9188 }
89+ }
9290 }
91+ }
9392 }
9493 return true;
95- },
96- [&](size_t, std::shared_ptr<channel_transport> transport,
97- int ec) { // connect response callback
98- if (ec == 0) {
99- // printf("[index: %zu] connect succeed.\n", index);
94+ },
95+ [&](channel_event &&event) {
96+ switch (event.get_type()) {
97+ case MASIO_EVENT_RECV_PACKET: {
98+ auto packet = event.retrive_packet();
99+ packet.push_back('\0');
100+ printf("receive data:%s", packet.data());
101+ break;
102+ }
103+ case MASIO_EVENT_CONNECT_RESPONSE:
104+ if (event.get_error_code() == 0) {
105+ auto transport = event.get_transport();
100106 std::vector<char> packet;
101107 append_string(packet, "GET /index.htm HTTP/1.1\r\n");
102- append_string(packet, "Host: www.ip138.com\r\n");
103- append_string(packet, "User-Agent: Mozilla/5.0 (Windows NT 10.0; "
104- "WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
105- "Chrome/51.0.2704.106 Safari/537.36\r\n");
108+
109+ if (transport->channel_index() == 0)
110+ append_string(packet, "Host: 203.162.71.67\r\n");
111+ else
112+ append_string(packet, "Host: www.ip138.com\r\n");
113+
114+ append_string(packet,
115+ "User-Agent: Mozilla/5.0 (Windows NT 10.0; "
116+ "WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
117+ "Chrome/51.0.2704.106 Safari/537.36\r\n");
106118 append_string(packet, "Accept: */*;q=0.8\r\n");
107119 append_string(packet, "Connection: Close\r\n\r\n");
108120
109121 transports.push_back(transport);
110122
111123 myasio->write(transport, std::move(packet));
124+ // myasio->close(transport);
125+ /*std::shared_ptr<deadline_timer> delayOneFrame(
126+ new deadline_timer(*myasio));
127+ delayOneFrame->expires_from_now(std::chrono::milliseconds(10));
128+ delayOneFrame->async_wait(
129+ [delayOneFrame, transport](bool cancelled) {
130+ if (!cancelled) {
131+ myasio->close(transport);
132+ }
133+ });*/
134+ }
135+ break;
136+ case MASIO_EVENT_CONNECTION_LOST:
137+ printf("The connection is lost(user end)!\n");
138+ break;
112139 }
113- else {
114- // printf("[index: %zu] connect failed!\n");
115- }
116- },
117- [&](std::shared_ptr<channel_transport> transport) { // on connection lost
118- },
119- [&](std::vector<char> &&packet) { // on receive packet
120- packet.push_back('\0');
121- printf("receive data:%s", packet.data());
122- },
123- [](const vdcallback_t &callback) { // thread safe call
140+ },
141+ [](const vdcallback_t &callback) { // thread safe call
124142 callback();
125- });
126-
127- std::this_thread::sleep_for(std::chrono::seconds(1));
128- myasio->open(0, CHANNEL_TCP_CLIENT);
129- myasio->open(1, CHANNEL_TCP_SERVER);
130-
131- time_t duration = 0;
132- while (true) {
133- std::this_thread::sleep_for(std::chrono::milliseconds(50));
134- myasio->dispatch_packets();
135- duration += 50;
136- if (duration >= 10000) {
137- for (auto transport : transports)
138- myasio->close(transport);
139- myasio->close(1);
140- break;
141- }
143+ });
144+
145+ std::this_thread::sleep_for(std::chrono::seconds(1));
146+ myasio->open(0);
147+ myasio->open(1);
148+
149+ time_t duration = 0;
150+ while (true) {
151+ myasio->dispatch_events();
152+ if (duration >= 60000) {
153+ for (auto transport : transports)
154+ myasio->close(transport);
155+ // myasio->close(1);
156+ break;
142157 }
158+ duration += 50;
159+ std::this_thread::sleep_for(std::chrono::milliseconds(50));
160+ }
143161
144- std::this_thread::sleep_for(std::chrono::seconds(60));
162+ std::this_thread::sleep_for(std::chrono::seconds(60));
145163
146- return 0;
164+ return 0;
147165}
148166```
149167
0 commit comments