Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

Fork を使用して C でマルチプロセス ソケット サーバーを構築する

Fork を使用して C でマルチプロセス ソケット サーバーを構築する

C のフォークを備えたマルチプロセッシング ソケット サーバーを使用すると、複数のクライアント接続を同時に処理できます。 fork システム コールを利用することで、サーバーは接続されたクライアントごとに子プロセスを作成し、独立した通信チャネルを確保できます。このアプローチにより、複数のクライアントとの同時通信が可能になります。

C で fork を使用してマルチプロセッシング ソケット サーバーを実装する方法について説明します。C で fork を使用してマルチプロセッシング ソケット サーバーを実現するサーバー側プログラムとクライアント側プログラムのプログラミング例について説明します。

フォーク システム コールとは何ですか?

システム コールが既存のプロセスのクローンを作成する場合、それは「fork()」システム コールと呼ばれます。基本的に、実行中のプログラムを親と子として知られる 2 つの別個のプロセスに分割します。子プロセスと親プロセスのすべてのパラメータは、PID が異なることを除いて同じです。このシステム コールは以下を返します。

<オル>
  • 親プロセスに対する子プロセスの PID
  • 子供にはゼロ (0)
  • プログラミング例 1:サーバー側プログラム

    #include
    #include
    #include
    #include
    #include <文字列.h>
    #include
    #include
    #include

    #ポート 8888 を定義

    intメイン()
    {
        int serSoc、cliSoc;
        struct sockaddr_inserverAddr、clientAddr;
        socklen_t addrSize =sizeof (clientAddr);
        文字バッファ [1024];
        int clientCount =0;

        // サーバーソケットを作成します
        serSoc =ソケット(AF_INET, SOCK_STREAM, 0);
        if (serSoc <0) {
            perror (「ソケット作成エラー」);
            出口(1);
        }

        printf ("サーバー ソケットが作成されました。\n");

        // サーバーアドレスを設定しましょう
        serverAddr.sin_family =AF_INET;
        serverAddr.sin_port =htons (ポート);
        serverAddr.sin_addr.s_addr =INADDR_ANY;

       
        if (bind(serSoc, (struct sockaddr*) &serverAddr, sizeof (serverAddr)) <0) {
            perror (「バインディングのエラー」);
            出口(1);
        }

        // 受信接続のリスニングを開始します
        if (listen (serSoc, 5) ==0) {
            printf ("接続を待機しています...\n");
        } それ以外の場合は {
            pererror (「リスニング中のエラー」);
            出口(1);
        }

        一方 (1) {
            // クライアント接続を受け入れましょう
            cliSoc =accept (serSoc, (struct sockaddr* )&clientAddr, &addrSize);
            if (cliSoc <0) {
                perror("接続の受け入れエラー");
                出口(1);
            }

            // クライアント数を増やし、クライアント情報を表示します

            clientCount++;
            printf("クライアント %d からの接続を受け入れました:%s:%d\n", clientCount, inet_ntoa (clientAddr.sin_addr), ntohs (clientAddr.sin_port));
            printf ("接続されているクライアントの合計:%d\n", clientCount);

           
            pid_t pid =fork();

            if (pid ==0) {
                // 子プロセス

               
                閉じる (serSoc);

                // クライアントからのメッセージを受信する
                一方 (1) {
                    memset (バッファー, 0, sizeof(バッファー));
                    if (recv (cliSoc , バッファ, sizeof (バッファ), 0) <0) {
                        perror (「データ受信エラー」);
                        終了(1);
                    }

                    printf ("クライアント %d からデータを受信しました:%s\n", clientCount, バッファ);

                    // 受信したメッセージをクライアントにエコーバックします。
                    if (send (cliSoc , バッファ, strlen (バッファ), 0) 0) {
                // 親プロセス

               
                閉じる(cliSoc);
            } それ以外の場合は {
                perror (「フォーク時のエラー」);
                出口(1);
            }
        }

        // サーバーソケットを閉じます
        閉じる (serSoc);

        0を返します。
    }

    プログラムプログラミングの例 2:クライアント側プログラム

    #include
    #include
    #include
    #include
    #include <文字列.h>
    #include
    #include
    #include
    #ポート 8888 を定義
    #define SERVER_IP "127.0.0.1"

    intメイン()
    {
        int cliSoc;
        struct sockaddr_inserverAddr;
        文字バッファ [1024];
        // クライアントソケットを作成する
        cliSoc =ソケット (AF_INET, SOCK_STREAM, 0);
        if (cliSoc <0) {
            perror (「ソケット作成エラー」);
            出口(1);
        }

        printf("クライアント %d ソケットが作成されました。\n", getpid ());

        // サーバーアドレスパラメータを設定します
        serverAddr.sin_family =AF_INET;
        serverAddr.sin_port =htons (ポート);
        serverAddr.sin_addr.s_addr =inet_addr (SERVER_IP);
        // サーバーに接続します
        if (connect (cliSoc , (struct sockaddr*) &serverAddr, sizeof (serverAddr)) <0) {
            perror("サーバーへの接続エラー");
            出口(1);
        }

        printf ("サーバーに接続しました。\n");
        一方 (1) {
            // ユーザーからの入力を読み取ります
            printf ("クライアント %d - メッセージを入力してください:", getpid ());
            fgets (buffer, sizeof(buffer), stdin);

           
            if (send (cliSoc , バッファ, strlen (バッファ), 0) <0) {
                perror (「データ送信エラー」);
                終了 (1);

            }
            // サーバーからのレスポンスを受け取る
            memset (バッファー, 0, sizeof(バッファー));
            if (recv (cliSoc , バッファ, sizeof (バッファ), 0) <0) {
                perror (「データ受信エラー」);
                出口(1);
            }
            printf ("クライアント %d - サーバーの応答:%s\n"、getpid ()、buffer);
        }

        // クライアントソケットを閉じる
        閉じる (cliSoc );
        0を返します。
    }

    出力:

    **サーバープログラムのコンパイル**
    $ gcc ser.c -o ser
    $ ./人
    サーバーソケットが作成されました。
    接続をリッスンしています...
    サーバーソケットが作成されました。
    接続をリッスンしています...
    クライアント 1 からの接続を受け入れました:127.0.0.1:59074
    接続されているクライアントの合計:1
    クライアント 1 からデータを受信しました:hii admin
    クライアント 2 からの接続を受け入れました:127.0.0.1:40192
    接続されているクライアントの合計:2
    クライアント 2 からデータを受信しました:皆さん、こんにちは
    **クライアント 1 プログラムのコンパイル**
    $ gcc cel.c -o cel
    $ ./セル
    クライアント 4007 ソケットが作成されました。
    サーバーに接続されました。
    クライアント 4007 - メッセージを入力してください:hii admin

    **クライアント 2 プログラムのコンパイル**
    $ gcc cel.c -o cel
    $ ./セル
    クライアント 4024 ソケットが作成されました。
    サーバーに接続されました。
    クライアント 4024 - メッセージを入力してください:皆さん、こんにちは

    説明:

    このプログラミング例では、C のフォークを使用したマルチプロセッシング ソケット サーバーの実装について説明しました。ここでサーバー側プログラムでは、サーバー ソケットを作成し、それを特定のアドレスとポートにバインドし、受信接続をリッスンします。クライアントが接続すると、「fork()」を使用して子プロセスが作成されます。これにより、複数のクライアントを同時に処理できるようになります。子プロセスはクライアントからメッセージを受信し、クライアントの ID を含むデータを表示します。このマルチプロセッシング ソケット サーバーにより、「n」個のクライアントとの同時通信が可能になります。

    結論

    C での fork を使用したマルチプロセッシング ソケット サーバーの実装について説明しました。fork システム コールを使用すると、複数のクライアント接続を同時に処理できるようになります。これにより、複数のクライアントとの同時通信とクライアント リクエストの効率的な処理が可能になります。

    著者について

    Fork を使用して C でマルチプロセス ソケット サーバーを構築する

    バンデブ ゴーシュ

    Bamdeb Ghosh は、ワイヤレス ネットワーキング ドメインでの実践経験を持っています。彼は、Android、Bluetooth、Linux コマンド、Python の知識に加え、ワイヤレスまたは有線ネットワーキングにおける Wireshark キャプチャ分析の専門家です。彼のサイトをフォローしてください:wifisharks.com


    1. strncmpライブラリ関数を使用して2つの文字列を比較するCプログラムを作成します

      Strncmpは、string.hファイルに存在する事前定義されたライブラリ関数であり、2つの文字列を比較し、どちらの文字列が大きいかを表示するために使用されます。 strcmp機能(文字列比較) この関数は2つの文字列を比較します。両方の文字列の最初の2つの一致しない文字のASCIIの違いを返します。 構文 int strcmp (string1, string2); 差がゼロに等しい場合、string1=string2。 string2。 差が負の場合、string1

    2. C言語でのさまざまな検索手法は何ですか?

      検索手法とは、要素のリストから重要な要素を見つけることです。 指定された要素がリストに存在する場合、検索プロセスは成功したと言われます。 指定された要素がリストに存在しない場合、検索プロセスは失敗したと言われます。 C言語は、2種類の検索手法を提供します。それらは次のとおりです- 線形検索 二分探索 線形探索 キー要素の検索は直線的に行われます。 これは最も簡単な検索手法です。 リストが並べ替えられることは想定されていません。 制限-より多くの時間を消費し、システムの電力を削減します。 入力(i / p) ソートされていない要素のリスト、キー。 出力(o /