Working atop the Client API is an optional Message API which provides
additional features for the purpose of creating protocols similar to AMQP and
MQTT. It consists of a specific message structure (vrtql_msg
) and functions to send (vrtql_msg_send()
) and receive (vrtql_msg_recv()
) it. The message structure
includes two maps (hashtables of string key/value pairs) and a payload. One map,
called routing
, is designed to hold routing information for
messaging applications. The other map, called headers
, is for
application use. The payload can hold both text and binary data.
The Message API uses a normal WebSocket connection (vws_cnx
) to send and receive messages in the
same way as the Client API. The only difference is that it deals in
vrtql_msg
objects and
automatically handles serialization and deserialization on and off the
wire. Messages can be serialized in two formats: JSON and MessagePack. Both
formats can be sent over the same connection on a message-by-message basis. That
is, the Message API is able to auto-detect each incoming message’s format and
deserialize accordingly. Thus connections support mixed-content messages: JSON
and MessagePack.
The following is a basic example of using the API.
#include <vws/message.h> int main() { vws_cnx* cnx = vws_cnx_new(); cstr uri = "ws://localhost:8181/websocket"; if (vws_connect(cnx, uri) == false) { printf("Failed to connect to the WebSocket server\n"); vws_cnx_free(cnx); return 1; } // Create a message vrtql_msg* request = vrtql_msg_new(); vrtql_msg_set_routing(request, "key", "value"); vrtql_msg_set_header(request, "key", "value"); vrtql_msg_set_content(request, "payload"); // Send if (vrtql_msg_send(cnx, request) < 0) { printf("Failed to send: %s\n", vws.e.text); vrtql_msg_free(request); vws_cnx_free(cnx); return 1; } // Receive vrtql_msg* reply = vrtql_msg_recv(cnx); if (reply == NULL) { // There was no message received and it resulted in timeout } else { // Free message vrtql_msg_free(reply); } // Cleanup vrtql_msg_free(request); vws_disconnect(cnx); vws_cnx_free(cnx); return 0; }