Apidog

オールインワン協働API開発プラットフォーム

API設計

APIドキュメント

APIデバッグ

APIモック

API自動テスト

初心者向け:C言語でWebSocketを実装する

WebSocket は、クライアントとサーバー間のリアルタイムの双方向データ交換に使用される強力な通信プロトコルです。本文では、C言語でのWebSocket の実装方法を皆さんに紹介していきたいと思います。

中村 拓也

中村 拓也

Updated on 11月 12, 2024

WebSocket は、クライアントとサーバー間のリアルタイムの双方向データ交換に使用される強力な通信プロトコルです。 長期間の接続を確立して維持できるため、リアルタイムのデータ更新が必要なアプリケーションに広く利用されています。 WebSocket APIを実装するには、たくさんの方法が利用可能です。本文では、C言語でのWebSocket の実装方法を皆さんに紹介していきたいと思います。

libwebsocketsのインストール

libwebsocketsは、C言語で書かれた軽量で効率的なWebSocketサーバーライブラリです。WebSocketは、リアルタイムで双方向の通信を提供するプロトコルであり、Webアプリケーションやネットワークアプリケーションの開発に広く使用されています。

libwebsocketsは、WebSocketのプロトコルをサポートするための機能を提供します。これにより、C言語を使用して簡単にWebSocketサーバーを作成することができます。libwebsocketsは、低レベルのネットワーク操作を抽象化し、ユーザーがWebSocket接続の確立、メッセージの送受信、接続の管理などを容易に行えるようにします。また、libwebsocketsは、高性能でスケーラブルなWebSocketサーバーを構築するためのさまざまな機能を提供します。マルチスレッドやイベント駆動のプログラミングモデルに対応しており、同時に多くのクライアントとの接続を処理することができます。また、プロトコルの拡張や暗号化など、さまざまなWebSocket関連の機能もサポートしています。

C言語

次のように、Gitコマンドを使用して、簡単にlibwebsocketsをインストールすることができます:

git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
mkdir build
cd build
cmake ..
make && sudo make install
pkg-config --modversion libwebsockets

libwebsockets.hを追加

libwebsockets.hを追加するために、次のコマンドが利用されます。

#include <libwebsockets.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

ロジックコードを書く

#include <libwebsockets.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// Structure to store data for each WebSocket session
struct per_session_data {
};

// Callback function for WebSocket server messages
int callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) {
    switch (reason) {
        case LWS_CALLBACK_ESTABLISHED: // Handle new connection event
            // Add a timer to send a timestamp every second
            lws_callback_on_writable(wsi);
            break;
        case LWS_CALLBACK_SERVER_WRITEABLE: // Handle send data event
            // Send the timestamp
            time_t t = time(NULL);
            char timestamp[20];
            sprintf(timestamp, "%ld", t);
            lws_write(wsi, timestamp, strlen(timestamp), LWS_WRITE_TEXT);
            lws_callback_on_writable(wsi);
            break;
        // Other events omitted
    }
    return 0;
}

int main(int argc, char **argv) {
    // Create the WebSocket protocol
    static struct lws_protocols protocols[] = {
        {
            "demo-protocol", // Protocol name, should match the WebSocket protocol in the frontend code
            callback, // Callback function pointer
            sizeof(struct per_session_data), // Size of data for each session (connection)
            0, // No additional protocol parameters
            NULL, NULL, NULL
        },
        { NULL, NULL, 0, 0 } // Protocol list ends with NULL
    };

    // Create the WebSocket context
    struct lws_context_creation_info info = {
        .port = 3001, // Listening port number
        .protocols = protocols // Protocol list
    };
    struct lws_context *context = lws_create_context(&info);

    // Check if WebSocket context creation was successful
    if (!context) {
        printf("Failed to create WebSocket context.\n");
        return -1;
    }

    // Enter the loop and wait for WebSocket connections
    while (1) {
        lws_service(context, 50);
    }

    // Clean up and close the WebSocket context
    lws_context_destroy(context);

    return 0;
}

フロントエンドページをWebSocketに接続

ページの作成

まず、index.htmlというページを作成する必要があります。このページを作成すると、次のコードを書き込みます:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = () => {
        if ('WebSocket' in window) {
            // Create a WebSocket connection
            let ws = new WebSocket('ws://127.0.0.1:3001/websocket');
            // Push a message when the connection is successfully established, and the server can start pushing data
            ws.onopen = () => {
                console.log('websocket success---');
                ws.send('success');
            }
            ws.onmessage = (message) => {
                let data = message.data;
                console.log('get websocket message---', data);
            }
            ws.onerror = () => {
                console.error('websocket fail');
            }
        } else {
            console.error('dont support websocket');
        };
    };
</script>

</head>
<body>
  
</body>
</html>

ページを開く

ページを作成すると、そのファイルを開きます:

ページを開く

WebSocketの結果の確認

バックエンドは、まずフロントエンドからメッセージ「OPEN SUCCESS」を受信します。このメッセージは、WebSocketの構築を始めても良いっていう意味になります。

そして、WebSocketサーバーとの接続が確立した後、バックエンドは常にフロントエンドに情報を出力します。

Websocketのメッセージ

ApidogでWebSocketを直感的な操作で実装する

Apidogは非常に包括的なAPI管理ツールとして、REST、SOAP、GraphQL、WebSocketなど、様々なプロトコルに対応しています。次は、Apidogの直感的なUIを使って、たったの4ステップでWebSocketを実装する方法を解説します。

button

ステップ⒈接続を確立する

WebSocketは、簡単なハンドシェイクプロセスを通じて接続を確立します。Apidogを使用して、アドレスバーにエンドポイントとなるURLを入力し、「接続」ボタンをクリックしてサーバーとのハンドシェイクを完了し、WebSocket接続を確立することができます。

WebSocketとの接続を確立

また、認証やその他の複雑なシナリオを満たすために、パラメータ、ヘッダー、クッキーなど、ハンドシェイク中に渡す必要があるパラメータをカスタマイズすることもできます。

ステップ⒉メッセージの送受信をする

接続が確立されたら、「Message」タブの下にメッセージを書くことができます。テキスト、JSON、XML、HTML、その他のテキスト形式のメッセージを直接に書くことに加えて、バイナリ形式のメッセージはBase64または16進数を使用して書くことにも対応できます。メッセージを「送信」すると、レスポンスをすぐ取得することができます。

Apidogは、接続ステータス、送信メッセージ、受信メッセージを新着順に表示する新しいタイムラインビューを提供します。あるメッセージをクリックすると、その詳細情報を簡単に表示できます。

ApidogでWebSocket APIの送受信をする

ステップ⒊WebSocket API仕様書を書く

Apidogの優れたドキュメンテーション機能は、WebSocket APIでも利用できます。WebSocket APIの状態、責任者、およびタグを設定し、Markdown形式で詳細な説明を入れることで仕様書を簡単に作成することができます。

ApidogでWebSocket API仕様書作成

もちろん、WebSocket APIの仕様書を作成すると、それを外部チームと共有したり、ブラウザで直接表示したりすることもできます。

ステップ⒋WebSocket APIを保存する

デバッグした後、「保存」ボタンをクリックしてWebSocket APIを現在のプロジェクトに保存することができます。その後、他のチームメンバーが当該APIにアクセスしたり、デバッグしたりすることができるようになります。

ApidogでWebSocket APIを保存

結論

結論として、C言語で WebSocket を実装するには、必要なヘッダーファイルを含む「libwebsockets」ライブラリをインストールし、ロジックコードを記述する必要があります。この方法でWebSocketを実装するには、必要なコーティング能力が不可欠なことになります。ただし、Apidogという包括的なAPI管理ツールを活用すると、非常に直感的なUIで、コードなしでもWebSocketリクエストを送信して、WebSocket 機能をテストすることができます。

button
ApidogでバックエンドAPI開発の効率をどう向上させるか?チュートリアル

ApidogでバックエンドAPI開発の効率をどう向上させるか?

ApidogはAPI管理の全体的なソリューションを提供し、定義からデバッグ、ドキュメント作成までバックエンド開発を最適化します。プロジェクトの規模に関わらず、開発者が効率的に作業を完了するのを支援します。

中村 拓也

11月 25, 2024

APIテスト効率化:ApidogでのJSONレスポンス管理法チュートリアル

APIテスト効率化:ApidogでのJSONレスポンス管理法

この記事では、ApidogでJSONレスポンスからアサーション設定、変数抽出、JSONパスのコピー方法を解説しました。APIテストの自動化と効率的なレスポンス検証が簡単になり、データの再利用も可能です。Apidogを使い、API機能を確認しましょう。

中村 拓也

11月 20, 2024

ApidogとAlgolia統合で実現する効率的なドキュメント検索チュートリアル

ApidogとAlgolia統合で実現する効率的なドキュメント検索

本記事は、AlgoliaをApidogと統合し、APIドキュメントの検索機能を改善する方法を紹介します。最適な検索設定を維持しながら、情報アクセスの迅速さと効率性を向上させ、ユーザー体験を向上させます。

中村 拓也

11月 19, 2024