IXWebSocket: An Open Source C++ Library for WebSocket Development

IXWebSocket is a WebSocket library specifically designed for C++, used to build client and server applications. It is lightweight, does not depend on the Boost library, and provides all the features needed for WebSocket development, such as SSL encryption and compression. Since 2017, it has handled massive real-time messages in large mobile video games. Additionally, the library offers HTTP client and server functionalities (though this part is not as thoroughly tested as WebSocket) and supports multiple platforms including macOS, iOS, Linux, Android, Windows, and FreeBSD.

🌐 Basics of WebSocket and Advantages of IXWebSocket

WebSocket is a network communication protocol that allows for full-duplex communication (bidirectional, simultaneous transmission) over a single TCP connection. This differs from the traditional HTTP request-response model, as WebSocket establishes a persistent connection through a single HTTP handshake, making it particularly suitable for scenarios requiring low latency and real-time data exchange, such as online chat, real-time gaming, financial trading platforms, and live data displays.

The advantages of IXWebSocket are as follows:

  • Lightweight and efficient: It does not rely on large libraries like Boost, and the library itself is designed with performance and low overhead in mind.
  • Easy to integrate and use: The API is designed to be simple, requiring only the inclusion of header files and linking the library to start development.
  • Comprehensive functionality: It supports SSL encryption, compression, and provides HTTP client and server code.

⚙️ Core Features and Code Examples

Client Implementation

Below is a basic WebSocket client code example that connects to a server, sends a message, and handles received messages and connection events:

#include <ixwebsocket/IXWebSocket.h>
#include <ixwebsocket/IXNetSystem.h>
#include <iostream>
#include <thread>

int main() {
    // Initialize network system (required for Windows platform)
    ix::initNetSystem();

    // Create WebSocket object and set URL
    ix::WebSocket webSocket;
    webSocket.setUrl("ws://localhost:8080");

    // Set message callback function
    webSocket.setOnMessageCallback([](const ix::WebSocketMessagePtr& msg) {
        if (msg->type == ix::WebSocketMessageType::Message) {
            std::cout << "Received message: " << msg->str << std::endl;
        }
        else if (msg->type == ix::WebSocketMessageType::Open) {
            std::cout << "Connection established" << std::endl;
        }
        else if (msg->type == ix::WebSocketMessageType::Error) {
            std::cout << "Connection error: " << msg->errorInfo.reason << std::endl;
        }
    });

    // Start connection
    webSocket.start();

    // Send a message
    webSocket.send("Hello, WebSocket!");

    // Main loop to keep the program running
    while (true) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    // Clean up network system
    ix::uninitNetSystem();
    return 0;
}

Server Implementation

Below is a simple WebSocket server example that starts a server and handles client connections and messages:

#include <ixwebsocket/IXWebSocketServer.h>
#include <iostream>

int main() {
    // Specify server port
    int port = 8080;

    // Create WebSocket server instance
    ix::WebSocketServer server(port);

    // Start server
    auto res = server.listen();
    if (!res.first) {
        // Listening failed
        std::cerr << "Error starting server: " << res.second << std::endl;
        return 1;
    }

    // Start accepting connections
    server.start();

    std::cout << "WebSocket server is running on port " << port << std::endl;
    std::cout << "Press Enter to stop the server..." << std::endl;
    std::cin.get();

    // Stop server
    server.stop();
    return 0;
}

Enabling TLS/SSL Encryption

To establish a secure WebSocket connection (using wss://), you need to configure TLS options. Below is a basic method to enable TLS on the server side:

// ... Previous server setup code ...

ix::WebSocketServer server(port);
ix::SocketTLSOptions tlsOptions;

// Configure TLS options
tlsOptions.certFile = "path/to/your/certificate.pem";  // Path to certificate file
tlsOptions.keyFile = "path/to/your/private-key.pem";   // Path to private key file
tlsOptions.tls = true; // Must be set to true on the server side

server.setTLSOptions(tlsOptions);

// ... Start server ...

When connecting from the client, simply change the protocol in the URL to wss://, and the library will automatically attempt to establish a secure connection.

🛠️ Real-World Application Scenarios

The high performance and low latency characteristics of IXWebSocket make it suitable for various real-time application scenarios:

  • Real-time chat applications: Utilizing the bidirectional communication capabilities of WebSocket, users can send and receive messages instantly.
  • Game development: This library has been used in large mobile video games to handle a large volume of real-time message transmission.
  • File transfer: Large files can be efficiently transferred over WebSocket connections.
  • Real-time data display: For example, in financial trading platforms, real-time stock price changes need to be displayed.

💡 Project Integration and Build

Integrating IXWebSocket into your C++ project is very simple, primarily built using CMake:

  1. Clone the repository:

    git clone https://github.com/machinezone/IXWebSocket.git
    cd IXWebSocket
  2. Build:

    mkdir build
    cd build
    cmake ..
    make

After building, link the generated library files to your project and include the corresponding header files in your code.

💎 Conclusion

With its lightweight design, simple API, and strong cross-platform support, IXWebSocket provides C++ developers with an efficient and reliable WebSocket solution. Whether building real-time chat systems, multiplayer online games, or IoT applications requiring bidirectional communication, IXWebSocket can help you easily tackle complex network communication challenges.

Leave a Comment