いっしょにtalk C栗(第百五十八回:C言語例--AF_INETドメインに基づくストリームソケット通信)


皆さん、こんにちは、前回はAFに基づいてUNIXドメインにおけるデータレターソケット通信の例として,今回述べた例は,AF_ベースである.INETドメインのストリームソケット通信.余談はさておき,話は本筋に戻る.一緒にtalk C栗を食べましょう!
見官たち、私たちは前回の中で一緒に私たちの2番目の料理を作りました.AFに基づいています.UNIXドメインのデータ・レポート・ソケット通信.今日、私はみんなと一緒に3番目の料理を作ります:AFに基づいてINETドメインのストリームソケット通信.
  • 第三の料理のレシピを作る:流套接字過程.
  • 第3の料理を作る食材:流ソケットのインタフェース、ソケットの属性、ソケットのアドレス情報.

  • 皆さん、以上の内容は、前の章の中で詳しく紹介しましたが、もし皆さんが忘れたら、前の内容を参考にすることができます.重点は第百四十七回の内容です.これは私たちのレシピですから.食材の中で最も面倒なのはソケットアドレス情報で、150回の例を参考にすることができます.余計なことを言って、私たちは具体的なコードで実証します.
    サーバ側の通信プロセスとそのコード
    //1.            : ,     ,     getaddrinfo  ;
        char * host = "localhost";  //using localhost IP address:127.0.0.1
        char * server = "1080";     //using port 1080, it must be more then 1024
        struct addrinfo hints;
        struct addrinfo *result;
    
        memset(&hints,0,sizeof(struct addrinfo));
        result = NULL;
    
        hints.ai_flags = AI_NUMERICSERV;
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
    
        //get address info ,it has all attribute of socket
        res = getaddrinfo(host,server,&hints,&result);
    //2.          
        server_fd = socket(result->ai_family,result->ai_socktype,result->ai_protocol);
    //3.                     
        res = bind(server_fd,result->ai_addr,result->ai_addrlen);
    //4.       ,       ,                
        res = listen(server_fd,2);
    //5.            ,           socket
        client_fd = accept(server_fd,NULL,NULL);
    //6.         
        res = read(client_fd,buf,BUF_SIZE);
        printf("[server] receiving data (%s) from client by socket
    "
    ,buf); //7. , if(result->ai_next) freeaddrinfo(result); res = close(client_fd); res = close(server_fd);

    クライアントの通信プロセスとそのコード
    //1.           : ,     ;
        char * host = "localhost";  //using localhost IP address:127.0.0.1
        char * server = "1080";     //using port 1080, it must be more then 1024
        struct addrinfo hints;
        struct addrinfo *result;
    
        memset(&hints,0,sizeof(struct addrinfo));
        result = NULL;
    
        hints.ai_flags = AI_NUMERICSERV;
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
    
        //get address info ,it has all attribute of socket
        res = getaddrinfo(host,server,&hints,&result);
    //2.        ;
        client_fd = socket(result->ai_family,result->ai_socktype,result->ai_protocol);
    //3.                ;
        res = connect(client_fd,result->ai_addr,result->ai_addrlen);
    //4.         ;
        printf("[client] sending data (%s )to server by socket 
    "
    ,buf); res = write(client_fd,buf,sizeof(buf) ); //5. , ; if(result->ai_next) freeaddrinfo(result); res = close(client_fd);

    官达、以上は核心コードで、完全なコードは私の资源の中に置いて、みんなはここをクリックしてダウンロードして使うことができます.
    上記のコードについて、補足説明をします.
  • まずソケットアドレスの情報を取得してからソケットを作成します.レシピの順序とは一致しませんが、これは合理的です.以前ソケットを作成したとき、関数にソケットの属性を直接書き込むためです.ここではgetaddrinfo関数の結果を用い,この方法はコードの移植性を向上させることができる.この方法はbind関数にも用いられた.
  • 通信でlocalhostホストを使用し、ポート番号:1080を指定しました.ポート番号を指定するには、1024より大きい値が必要です.Linuxシステムは1024未満のポートに専用のサービスをバインドしているからです.
  • ソケットを解放すると同時に、ソケットアドレス情報を格納するチェーンテーブルを解放します.
  • Unixドメインソケット通信を用いた例と比較して、主にソケット属性とアドレスを設定する方式が異なり、通信中にデータを読み出して受信する方式は同じである.

  • サーバ側のコードとクライアント側のコードをそれぞれコンパイルし、実行可能な異なるファイルにコンパイルする必要があります.
    $ gcc Ex092_InetStreamSocketClient.c -o client  //     
    $ gcc Ex092_InetStreamSocketServer.c -o server  //      

    皆さん、おいしい料理ができました.一緒に食べてみましょう.味わう方法はプログラムを実行することです.次はプログラムの実行結果です.参考にしてください.
    $./server &             //        
    [1] 4643
    $ ./client              //     
    please input less then 8 chars for using. 
    hello
    [client] sending data (hello )to server by socket  
    [server] receiving data (hello) from client by socket
    $ ./client               //       
    please input less then 8 chars for using. 
    stream
    [client] sending data (stream )to server by socket  
    [server] receiving data (stream) from client by socket
    [1]+  Done                    ./server          //        

    上記の実行結果から、クライアントはソケットを介してサーバにデータを送信し、サーバはソケットを介してクライアントからデータを受信することで、クライアントとサーバ側はソケットを介して通信することができることがわかります.また,我々は2回の通信を行い,通信の回数を自分で制御することができ,無限回に書くことも可能である.通信のたびに完全な通信プロセスと見なすことができ、私たちが通信中に送信したデータは文字列「hello」と「stream」であり、他の文字列を送信することもできます.
    皆さん、AFベースについてINETドメインのストリーミングソケット通信の例について述べる.後に何か例があるか知りたいので、次の分解を聞いてください.