Как иметь мангуста для управления несколькими URL-адресами веб-сокетов - PullRequest
0 голосов
/ 03 октября 2018

У меня есть примеры веб-сокетов для Mongoose 6.12, хорошо работающие на моей встроенной платформе.

Меня интересует, как можно управлять несколькими URL-адресами веб-сокетов?

Наша цель - иметь на нашей платформе несколько веб-страниц, каждая из которых периодически получает данные через веб-сокеты с сервера.В зависимости от URL-адреса веб-сокета будет возвращаться другой набор данных.

При использовании примера "websocket_chat" в качестве ссылки при отправке кода:

for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) {
    if (c == nc) continue;
    mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, buf, strlen(buf));
}

в идеале будет отфильтровываться URL-адрес.которые не связаны с обслуживаемым URL:

for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) {
    if ((c == nc) **|| (strcmp(c->uri, "/ws/page1") == 0)**) continue;
    mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, buf, strlen(buf));
}

Но похоже, что соединение не содержит URL, связанный с соединением.

Этот код периодически вызывается веб-сервером, не основанным на событии Mongoose.

Есть ли у вас какие-либо предложения о том, как этого добиться?

Большое спасибо.

Фред.

1 Ответ

0 голосов
/ 03 октября 2018

Я думаю, вы можете поймать событие MG_EV_WEBSOCKET_HANDSHAKE_REQUEST, которое имеет доступ к URI и которое может установить маркер в user_data:

static void ev_handler(struct mg_connection *c, int ev, void *ev_data) {
  switch (ev) {
    case MG_EV_WEBSOCKET_HANDSHAKE_REQUEST: {
      struct http_message *hm = (struct http_message *) ev_data;
      c->user_data = "foo";
      if (mg_vcmp(&hm->uri, "/uri1") == 0) c->user_data = "bar";
      break;
    }

Затем в обработчике вещания проверьте значениеэтого маркера.

for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) {
  if (c == nc) continue; /* Don't send to the sender. */
  if (c->user_data && strcmp(c->user_data, "bar") == 0)       
    mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, buf, strlen(buf));
  }
}
...