使用mongoose来创建嵌入式websocket客户端和http客户端
使用mongoose原因1 嵌入式非常合适 2 在简单需要的场合下,不需要其他文件,只需要两个文件包含 包含mongoose.h 和 mongoose.c 就可以使用了,比较方便,尤其在嵌入式里面,这两个文件就很有用了,不用其他依赖
httpclient#include "httpclient.h"
#include "mongoose.h"
/* RESTful server host and request URI */
//static const char *s_url =
//"http://www.abc/data/1";
static int s_exit_flag = 0;
static PageCallback gcallback = NULL;
static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
struct http_message *hm = (struct http_message *) ev_data;
int connect_status;
switch (ev) {
case MG_EV_CONNECT:
connect_status = *(int *)ev_data;
if (connect_status != 0) {
printf("Error connecting to server: %s\n", strerror(connect_status));
s_exit_flag = 1;
}
break;
case MG_EV_HTTP_REPLY:
//printf("Got reply:\n%.*s\n", (int)hm->body.len, hm->body.p);
nc->flags |= MG_F_SEND_AND_CLOSE;
s_exit_flag = 1;
if (gcallback != NULL)
{
gcallback(hm->body.p, (int)hm->body.len);
}
break;
case MG_EV_CLOSE:
if (s_exit_flag == 0) {
printf("Server closed connection\n");
s_exit_flag = 1;
};
break;
default:
break;
}
}
int httpclient(const char* url, PageCallback callback)
{
struct mg_mgr mgr;
struct mg_connection *nc;
gcallback = callback;
mg_mgr_init(&mgr, NULL);
nc = mg_connect_http(&mgr, ev_handler, url, NULL, NULL);
mg_set_protocol_http_websocket(nc);
printf("Starting RESTful client against %s\n", url);
while (s_exit_flag == 0) {
mg_mgr_poll(&mgr, 1000);
}
mg_mgr_free(&mgr);
return 0;
}
websocket 客户端
包含mongoose.h 和 mongoose.c 就可以使用了,比较方便,尤其在嵌入式里面,这两个文件就很有用了,不用
#include "mongoose.h"
static int s_done = 0;
static int s_is_connected = 0;
static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
(void)nc;
switch (ev) {
case MG_EV_CONNECT: {
int status = *((int *)ev_data);
if (status != 0) {
printf("-- Connection error: %d\n", status);
}
break;
}
case MG_EV_WEBSOCKET_HANDSHAKE_DONE: {
struct http_message *hm = (struct http_message *) ev_data;
if (hm->resp_code == 101) {
printf("-- Connected\n");
s_is_connected = 1;
}
else {
printf("-- Connection failed! HTTP code %d\n", hm->resp_code);
/* Connection will be closed after this. */
}
break;
}
case MG_EV_POLL: {
char msg[500];
int n = 0;
#ifdef _WIN32 /* Windows console input is special. */
INPUT_RECORD inp[100];
HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
DWORD i, num;
if (!PeekConsoleInput(h, inp, sizeof(inp) / sizeof(*inp), &num)) break;
for (i = 0; i 1 ? argv[1] : "ws://127.0.0.1:8000";
mg_mgr_init(&mgr, NULL);
nc = mg_connect_ws(&mgr, ev_handler, chat_server_url, "ws_chat", NULL);
if (nc == NULL) {
fprintf(stderr, "Invalid address\n");
return 1;
}
while (!s_done) {
mg_mgr_poll(&mgr, 100);
}
mg_mgr_free(&mgr);
return 0;
}