オペレーティングシステムの設計上のコース

まず、カリキュラムの設計目標とタスク

目的:クライアント/サーバー・プログラムを達成するために、ネットワークプログラミングのLinux、マスター描画方法の基本的な方法ソケットに慣れること。

タスク:シンプルなプロトコルTCPクライアント/サーバアプローチに基づいて実施することができる簡単なプログラムを書きます。

 

第二に、理論とアルゴリズムの主なアイデアは、関与します

TCPプロトコル、ソケット、ネットワークプログラミング

 

第三に、特定の設計やアイデアの開発

二つのプログラム、クライアント、サーバーを書く、二つのプログラムのソケット接続を確立し、相互にデータを送信します。

 

第四に、コード

クライアント:

書式#include <stdio.hに> 
する#include <stdlib.h>に含ま
する#include < 文字列の.h> 
書式#include <unistd.h> 
書式#include <SYS / types.h>に
する#include <sysの/ socket.h>に
する#include <netinetの/  .H> 
の#include <ARPA / inet.h>
 の#defineポート8888 INT メイン()
{ // 一、创建套接字ソケットINT数sockfd =ソケット(AF_INET、SOCK_STREAM、0 );
        もし( -数sockfd == 1 
        { 
                perrorは(" ソケットが失敗"


        
        
                出口( - 1 ); 
        } 

        // 第二に、通信アドレス準備
        構造体;のsockaddr_in ADDR 
        addr.sin_family = AF_INET;       // 指定されたプロトコル・ファミリ、およびソケット()は一致パラメータ 
        addr.sin_port = htons(ポート);     // セット通信するために使用されるネットワークポート番号 
        INET_ATON(" 192.168.1.129 "、&​​addr.sin_addrを);      // ストア通信ネットワークIPアドレス

        // 第三に、接続サーバ
        のint CONは=(数sockfd、(接続構造体のsockaddr *)&ADDR、はsizeof (ADDRを));
         IF(CON == - 1 
        {
                perrorは(" 接続に失敗しました" ); 
                出口( - 1。); 
        } 
        のprintf(" 接続成功\ N-!" ); 

        // サーバとの4、交換データ
        のchar bufが[ 100 ] = { 0 };
         char型 * STR = " こんにちはサーバー。" ; 
        (、(STR)strlenを、数sockfd STRを送る0 ); 
        RECV(数sockfd、BUF、はsizeof(BUF)、0 ); 
        のprintf(" サーバーからの情報を受け取る:%S \ N- 、BUF) ;

        // 5、接続閉じる
        閉じる(数sockfd)を、

        戻り 0 ; 
}

 

サーバー

書式#include <stdio.hに> 
する#include <stdlib.h>に含ま
する#include < 文字列の.h> 
書式#include <unistd.h> 
書式#include <SYS / types.h>に
する#include <sysの/ socket.h>に
する#include <netinetの/  .H> 
の#include <ARPA / inet.h>
 の#defineポート8888 INT )(主
{ // 一、创建套接字INT数sockfd =ソケット(AF_INET、SOCK_STREAM、0 );
        もし( -数sockfd == 1 
        { 
                perrorは(" ソケットが失敗"


        
        )。
                出口( - 1 ); 
        } 

        // 第二に、通信アドレス準備
        構造体;のsockaddr_in ADDR 
        addr.sin_family = AF_INET; 
        addr.sin_port = htons(ポート); 
        INET_ATON(" 192.168.1.129 "、&addr.sin_addr); 

        // 3つ、ソケット・バインディングと通信アドレスは、
       int型のビンは、バインド(数sockfd、(= 構造体のsockaddr *)&ADDR、はsizeof (ADDR))を、
         IF(ビン== - 1 
        { 
                perrorは(" バインドに失敗しました" )。
                終了( - 1 ); 
        } 

         // 4つのリスニングポート 
         ビン=聞く(数sockfd、100 );
          IF(ビン== - 1。 
         { 
                perrorは(" 失敗リスン" ); 
                出口( - 1。); 
         } 
         のprintf(" スタートポートをリスニング%D ... \ N- " 、ポート); 

         // 5、接続要求処理
         構造体のsockaddr_in fromaddr; 
         のsocklen_tさlen = はsizeof (fromaddr);
          int型clientfd =(数sockfd、(受け入れ構造体のsockaddr *)&fromaddr、&LEN);
          IF(clientfd == - 1 
         { 
                perrorは(" 失敗アクセプト" ); 
                出口( - 1 ); 
         } 
          のprintf(" %Sは、N- \接続されています" 、INET_NTOA(fromaddr.sin_addr));
           // 6、クライアント・データ処理
        チャー BUF [ 100 ] = { 0 }; 
          RECV(clientfd、BUF、はsizeof(BUF)、0 ); 
          のprintf("クライアント:%S \ N- "BUF);
           のchar * STR = " こんにちはクライアント; 
          (clientfd、STR、strlenを(STR)を送信し、0 ); // 7は、接続閉じる          閉じる(clientfd)を、
          閉じる(数sockfd ); 戻り0 ; 
}

          


           

 

第五に、プログラムの業績は、スクリーンショットを表示します

 

VIテクノロジーの概要

1. TCPベースのネットワークプログラミング:

    接続に基づいて、相互作用の間に、接続を維持するために、サーバーとクライアントは、切断されていません。、正確性、完全性と連続性を確保するために、すべての誤ったデータ、データの検証、データを再送信

    欠点は、リソースの消費量が比較的大きいことです。

2.プログラミングの手順:

    サーバー:

      ①ソケットを作成します(ソケット)のソケット()

      ②メールアドレスを用意

      ③ソケットにバインドし、メールアドレスのバインディングを(作成)

      ④リスニングポート)(聞きます

      ⑤(私達accpetを接続するためのクライアントのために待っています)

      ⑥通信相手)は()(読み取り/書き込みデータを受信します

                 )()(/ RECVを送信

      ソケットをクローズ⑦

    クライアント:

      ①ソケットを作成します(ソケット)のソケット()

      ②メールアドレスを用意

      ③接続サーバ接続()

      ④)(データの読み出し/受信)(書き込み

             )()(/ RECVを送信

      ソケットをクローズ⑤ 

詳細3. API

(1)ソケット()関数

    int型のソケット(ドメイン、タイプ、プロトコル)

    ドメイン:

        AF_UNIX / AF_LOCAL / AF_FILE:ローカル通信

        AF_INET:ネットワーク通信のIPv4

        AF_INET6:ネットワーク通信のIPv6

        注意:AF場合はPFとしての効果に

    タイプ、通信の種類を選択し、含みます:

        SOCK_STREAM:TCP

        SOCK_DGRAM:UDP

    通信プロトコルを指定しますが、プロトコルが指定された2つのパラメータの前に完了しているので、今大部分が放棄され、0にする必要がありますプロトコル、

(2)結合()関数

    int型バインド(int型数sockfd、sockaddr構造体の* addrに、サイズ)

    数sockfd:ソケット記述子をバインドするには

サイズ:によって占め二番目のパラメータメモリ空間

    ADDR:3つのデータ構造のsockaddr構造体、sockaddr_un、sockaddr_in構造体に関し、

     sockaddrは、主に関数パラメータのために、データ・ストレージのための責任を負いません

     sockaddr_un、ときに、ローカル通信用のアドレスを用いてローカル通信の存在下、(SYS / un.h)

     ネットワーク通信の存在、ネットワーク通信は、アドレスデータを格納するための責任があるのsockaddr_in、

     構造体のsockaddr_in

{

         一貫した//パラメータはプロトコルスイートを指定し、ソケット(); sin_familyは

         sin_portは、通信ネットワークに使用する//ポート番号

         sin_addr; IPアドレスが格納されたネットワーク通信// 

     }

(3)聞く()関数

    int型(int型数sockfd、int型バックログ)聞きます

     数sockfd:ソケット数sockfdパラメータは、パッシブモードを特定し、それは、接続要求を受け入れることができるように

     バックログ:すなわち許可保留中の接続要求の数まで、最大長に接続された保留中のリクエストキューを表すが存在します。保留中の接続要求がサーバーの値に達した場合は、サーバーを接続する接続することにより、クライアント()操作は-1を返しますエラーとしてECONNREFUSED

(4)私達accpet()関数

    int型私達accpet(数sockfd、sockaddr構造体の* addrの、のsocklen_t * addrlenは)

     通信接続のための新しいソケットを作成中に、削除保留中の接続要求の接続要求キューに対応するソケット記述子から特定数sockfdパラメータ、戻りソケット

     接続要求の発信元を出力するためのaddrlenはaddrのとアドレス情報

     戻り値:新しく作成されたとクライアントの通信障害-1用ソケットディスクリプタ、エラー

(5)RECV()関数  

   int型のrecv(int型数sockfd、bufが、LEN、フラグ)

     障害物の課金データ:フラグ、通常は0であります

        O_NONBLOCK:ブロックされていない、何もデータが受信されない場合、エラーメッセージ、リターン

     戻り値:

        > 0、データ・バイトの数は、実際に受信します

        -1エラー、エラー

         0他端、通信遮断

(6)送信()関数

   int型の送信(int型の数sockfd、bufが、LEN、フラグ)

     フラグ:通常の送信をブロックし、0であります

     O_NONBLOCK:ブロックされていない、何もデータが受信されない場合、エラーメッセージ、リターン

(7)接続()関数

   int型接続(int型の数sockfd、ADDR、addr_len)

     参照パラメータバインド()

 

https://www.cnblogs.com/findumars/p/8030439.html

おすすめ

転載: www.cnblogs.com/rnss/p/10993530.html