いっしょにtalk C栗(第百五十六回:C言語例--AF_UNIXドメインベースのストリームソケット通信)


皆さん、こんにちは、前回のsocket通信アドレスの取得例ですが、今回の例はAF_ベースです.UNIXドメインのストリームソケット通信.余談はさておき,話は本筋に戻る.一緒にtalk C栗を食べましょう!
役人たちは、前の章でソケットの通信過程とソケットの細部を紹介しましたが、何か足りないような気がして、しばらくは思い出せませんでした.これは私たちがレシピも食材もあれば、おいしい料理を作ることができます.ああ!ありました.おいしい料理といえば、インスピレーションが来ました.私たちが欠けているのは、ソケットの総合的な練習です.つまり、前の章回の知識をつなぎ合わせて、ソケットの知識を総合的に使ってソケット通信を行う例を挙げます.このような例は、おいしい料理ですね.次は一緒にこのおいしい料理を作りましょう.私たちの最初の料理はAFに基づいています.UNIXドメインのストリームソケット通信.
  • 最初の料理のレシピを作る:流套接字過程.
  • 最初の料理を作る食材:流ソケットのインタフェース、ソケットの属性、ソケットのアドレス情報.

  • 皆さん、以上の内容は、前の章の中で詳しく紹介しましたが、もし皆さんが忘れたら、前の内容を参考にすることができます.重点は第百四十七回の内容です.これは私たちのレシピですから.余計なことを言って、具体的なコードで説明します.
    サーバ側の通信プロセスとそのコード
    //1.          
        server_fd = socket(AF_UNIX,SOCK_STREAM,0);
    //2.            : ,     ;
        memset(&address,0,sizeof(struct sockaddr_un) );
        address.sun_family = AF_UNIX;
        strncpy(address.sun_path,SOCKET_PATH,sizeof(address.sun_path)-1 );
    //3.                     
        addr_len = sizeof(struct sockaddr_un);
        res = bind(server_fd,(struct sockaddr *)&address,addr_len);
    //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. , res = close(client_fd); res = close(server_fd);

    クライアントの通信プロセスとそのコード
    //1.        ;
        client_fd = socket(AF_UNIX,SOCK_STREAM,0);
    //2.           : ,     ;
        memset(&address,0,sizeof(struct sockaddr_un) );
        address.sun_family = AF_UNIX;
        strncpy(address.sun_path,SOCKET_PATH,sizeof(address.sun_path)-1 );
        addr_len = sizeof(struct sockaddr_un);
    //3.                ;
        res = connect(client_fd,(struct sockaddr *)&address,addr_len);
    //4.         ;
        printf("[client] sending data (%s )to server by socket 
    "
    ,buf); res = write(client_fd,buf,sizeof(buf) ); //5. , ; res = close(client_fd);

    官达、以上は核心コードで、完全なコードは私の资源の中に置いて、みんなはここをクリックしてダウンロードして使うことができます.
    サーバ側のコードとクライアント側のコードをそれぞれコンパイルし、実行可能な異なるファイルにコンパイルする必要があります.
    $ gcc Ex090_UnixStreamSocketClient.c  -o client  //     
    $ gcc Ex090_UnixStreamSocketServer.c  -o server  //      

    役人たち、おいしい料理ができました.一緒に食べてみましょう.どうやって食べますか.もちろんプログラムを実行していますよ.コードを食べますか.以下はプログラムの実行結果です.参考にしてください.
    $ ./server  &          //        
    [1] 6968
    $ ./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. 
    socket
    [client] sending data (socket )to server by socket  
    [server] receiving data (socket) from client by socket
    
    $ ./client            //         
    please input less then 8 chars for using. 
    good
    [client] sending data (good )to server by socket  
    [server] receiving data (good) from client by socket
    [1]+  Done                    ./server      //       

    上記の実行結果から、クライアントはソケットを介してサーバにデータを送信し、サーバはソケットを介してクライアントからデータを受信することで、クライアントとサーバ側はソケットを介して通信することができることがわかります.また,我々は3回の通信を行い,通信の回数を自分で制御することができ,無限回に書くことも可能である.通信のたびに完全な通信プロセスと見なすことができ、私たちが通信中に送信したデータは文字列であり、3回の通信では3つの異なる文字列を送信した.
    前述したようにAF_に基づいてUNIXドメインのソケット通信は,本質的にファイルによって行われる.次に、検証します.
    ファイルのディレクトリはソケットのアドレスに設定されています:#define SOCKET_PATH “/tmp/SOCKET_TEST”
    $ ll /tmp/
    srwxr-xr-x  1 tom  tom      0  5  28 10:40 SOCKET_TEST=
    //          

    確かにSOCKETという名前がありますTESTのファイルで、このファイルのタイプはs、つまりソケットタイプです.
    皆さん、AFベースについてUNIXドメインのストリーミングソケット通信の例について述べる.後に何か例があるか知りたいので、次の分解を聞いてください.