LinuxベースのC++のネットワークプログラミング

11048 ワード

  • ソケットの基本概念
  • ソケット関数
  • ローカルソケットの例:サーバ側
  • ローカルソケットの例、クライアント
  • ローカルソケットの例:
  • を実行
  • ネットワークソケットの例:クライアント


  • ソケットの基本概念
    通信タイプ:ソケットがデータをどのように転送し、処理するかを制御し、データをパケット形式で転送する
  • 接続(connection)タイプ:すべてのパケットが順次伝送されることを確認し、パケットが失われた場合、
  • の再送を要求する.
  • データ・レポート・タイプ:パケットの到着順序が保証されず、パケットが
  • 失われる可能性があります.
    ネームスペース:ソケットアドレスフォーマットの指定
  • ローカルネームスペース:ソケットアドレスが通常ファイル名
  • インターネット名空間:ソケットアドレスは、1台のホスト上の複数のソケットを区別するためのインターネットアドレスとポート番号によって決定される
  • .
    プロトコル:データの転送方法の決定
    ソケット関数
    ソケット()関数:ソケットの作成
  • プロトタイプ:int socket(int domain,int type,int protocol);
  • パラメータ:ネームスペース、通信タイプ、プロトコル
  • 名スペース:PF_LOCAL(ローカル)またはPF_INET(Internet)
  • 通信タイプ:SOCK_STREAM(接続タイプ)またはSOCK_DGRAM(データ・レポート・タイプ)
  • プロトコル:0を渡し、システムにプロトコル(通常は最適プロトコル)
  • を自動的に選択させる
  • 戻り値:ソケット記述子
  • close()関数close()関数:ソケットを解放する
  • プロトタイプ:int close(int fd);
  • connect()関数:2つのソケット間の接続を作成する
  • お客様は、このシステム呼び出しを開始し、サーバとソケット接続
  • を確立しようとしています.
  • プロトタイプ:int connect(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
  • パラメータ:sockfdはファイル記述子である.addrはソケットアドレス構造体ポインタ(サーバアドレス)を指す.addrlenはサーバアドレス文字列の長さ
  • である.
  • 戻り値:0接続に成功しました.-1接続失敗
  • send()関数:データの送信
  • プロトタイプ:ssize_t send(int sockfd,const void* buf,size_t len,int flags);
  • は、ソケットが接続状態にある場合にのみ呼び出すことができる
  • である.
    bind()関数:バインドソケットとそのサーバアドレス
  • プロトタイプ:int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
  • Listen()関数:顧客接続のリスニング
  • プロトタイプ:int listen(int sockfd,int backlog);
  • パラメータ:backlogは、キューに入る接続の数を指定し、その値を超える接続は
  • から破棄されます.
    accept()関数:接続を受け入れ、その接続に新しいソケットを作成します.
  • プロトタイプint accept(int sockfd,struct sockaddr* addr,socklen_t addrlen);
  • パラメータ:addrはソケットアドレス構造体(クライアントアドレス)へのポインタ
  • である.
  • 戻り値:顧客接続を受け入れる新しいソケットを作成し、戻り値は新しいソケットファイル記述子
  • である.
  • 元のソケットファイル記述子は、新しい接続
  • を引き続き受け入れることができる.
    ローカルソケットの例:サーバー側
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    //      ,                “quit”  
    //     true,     false,          
    
    bool Serve(int client_socket)
    {
      while (true) {
        int length;
        char* msg;
        //              ,    0         
        if(read(client_socket,&length,sizeof(length)) == 0)
          return true;
        msg = new char[length];
        read(client_socket,msg,length);
        std::cout<std::endl;
        if(!strcmp(msg,"quit"))  {delete[] msg,msg = NULL;return false;}
        else delete[] msg, msg = NULL;
      }
    }
    
    int main(int argc,char* const argv[])
    {
      const char* const socket_name = argv[1];
      ing socket_fd;
      struct sockaddr_un name;
      bool serving = true;
      //     
      socket_fd = socket(PF_LOCAL,SOCK_STREAM,0);
      //       
      name.sun_family = AF_LOCAL;
      strcpy(name.sun_path,socket_name);
      //      
      bind(socket_fd,(struct sockaddr*)&name,SUN_LEN(&name));
      //      
      listen(socket_fd,5);
      //      ,        “quit”  
      while(serving)
      {
        struct sockaddr_un client_name;
        socklen_t client_name_len;
        int client_socket_fd;
        //        
        client_socket_fd = accept(socket_fd,(struct sockaddr*)&client_name,&client_name_len);
        serving = Serve(client_socket_fd); //      
        close(socket_fd);//      
      }
      close(socket_fd);
      unlink(socket_name); //       
      return 0;
    }

    ローカルソケットの例、クライアント
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    void SendMsg(int socket_fd,const char* msg)
    {
      int length = strlen(msg) + 1;
      write(socket_fd,&length,sizeof(length));
      write(socket_fd,msg,length);
    }
    int main(int argc, char const *argv[]) {
      const char* const socket_name = argv[1];
      const char* const msg = argv[2];
      int socket_fd;
      struct sockaddr_un name;
      //     
      socket_fd = socket(PF_LOCAL,SOCK_STREAM,0);
      //             
      name.sun_family = AF_LOCAL;
      strcpy(name.sun_path,socket_name);
      //  
      connect(socket_fd,(struct sockaddr*)&name,SUN_LEN(&name));
      //    
      SendMsg(socket_fd,msg);
      close(socket_fd);
      return 0;
    }
    

    ローカルソケットの例:実行
    プログラムテスト実行
  • リンクサービス・エンド・プログラムおよびクライアント・プログラム
  • をコンパイルする
  • サービス側プログラムディレクトリに入り、端末入力:./server/tmp/socket;./serverはサーバ側プログラム名、/tmp/socketは本サーバ起動後のソケットファイル名
  • である.
  • クライアントプログラムディレクトリに入り、端末に:./client/tmp/socket"Hello World!";Clientはクライアントプログラム名
  • サーバを停止し、クライアントにコマンドを入力:./client/tmp/socket"quit"
  • ネットワークソケットの例:クライアント
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    //   Web      
    void GetHomepage(int socket_fd)
    {
      char buffer[8192];
      sprintf(buffer,"GET /
    "
    ); write(socket_fd,buffer,strlen(buffer)); while(true){ ssize_t count = read(socket_fd,buffer,8192); if(count == 0) return; fwrite(buffer,sizeof(char),count,stdout); } } int main(int argc, char const *argv[]) { int socket_fd; struct sockaddr_in name; struct hostent* hostinfo; socket_fd = socket(PF_INET,SOCK_STREAM,0); name.sin_family = AF_INET; hostinfo = gethostbname(argv[1]); if(hostinfo == NULL) return 1; else name.sin_addr = *((struct in_addr*)hostinfo ->h_addr); name.sin_port = htons(80); if(connect(socket_fd,(struct in_addr*)&name,sizeof(struct sockaddr_in)) == -1) { perror("Failure to connect the server."); return 2; } GetHomepage(socket_fd); return 0; }


    “`