Skip to content

Commit 0db68bb

Browse files
authored
Update README.md
1 parent eef88cd commit 0db68bb

File tree

1 file changed

+94
-76
lines changed

1 file changed

+94
-76
lines changed

README.md

Lines changed: 94 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -40,110 +40,128 @@ ASIO Usage(Client Program):
4040
using namespace purelib::inet;
4141
4242
template <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
4747
int 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

Comments
 (0)