私はどのようにHTTPSERVERサーバを書くする方法を教え-1

  1. プロジェクト名:HttpServerをサーバー

     

    1. プロジェクト構造
    2. 知識の説明
    3. スタートプログラム開発
    4. コアプログラムの開発

     

  • プロジェクト構造

       三つのファイル、1 epoll_start.c、の合計は、プログラムを起動するので、指定されたディレクトリおよびポートアクセス・サーバ・リソースでこのプログラムを実装し、コアプログラム・ロジックがシンプルであるために、コアとしてepoll_main.cためのプログラムは、epoll_main.hです。

  •  必要な知識

       HTMLの知識HTTPプロトコルのIO多重化(ファイルディスクリプタ)ソケットプログラミングの基礎

  •   スタートプログラム開発
  • 書式#include <stdio.hに>
  • 書式#include <stdlib.h>に含ま
  • #include "epoll_func.h"
  • 書式#include <unistd.h>
  • INTメイン(int型ARGC、CHAR * ARGV []){
  • //裁判官はポートではなく、パスを開始します
  • IF(ARGC <2)
  • {
  • printf( "Useageの./a.outポートパス")。
  • }
  • あなたのポート=税引後営業利益(ARGV [1]);
  • //ディレクトリを変更します
  • INT RET = CHDIR(ARGV [2])。
  • もし(右== -1)
  • {
  • perrorは( "のchdirエラー");
  • 出口(1)。
  • }
  • //サービスを開始
  • runserver(ポート);
  • 0を返します。
  •  

    }

     

  •       コアプログラムの開発

    

//epoll_main.c機能がここに呼び出されます

INTのrunserver(INTポート){

//オープンリスニングサービス

int型EFD = epoll_create(MAX_EVENTS); //ファイルディスクリプタのツリーを作成します

 

int型LFD = createlfd(ポート); //ソケットとバインドローカルポートを作成します

addfdtoevets(EFD、LFD); //ファイルディスクリプタツリーLFDに追加

 

//カーネルによって返された情報に基づいて処理します

while (1)

{

int value = epoll_wait(efd,watchfd,2000,-1); //调用epoll_wait 等内核返回信息

 

for (int i = 0; i < value; i++) //epoll会返回事件的数量和对应监听的fd,循环判断

{

//判断是否时客户端的读事件

 

int checkfd = watchfd[i].data.fd;

if (checkfd == lfd) //如果是监听socket获得新的连接

{

//接受请求

struct sockaddr_in clientaddr;

int len = sizeof(clientaddr);

int confd = accept(lfd,(struct sockaddr *)&clientaddr,&len);

 

int flag = fcntl(confd, F_GETFL);

flag |= O_NONBLOCK;

fcntl(confd, F_SETFL, flag);

addfdtoevets(efd,confd);

 

}

 

else //socket的发送了数据,这里我们监听的是读事件

{

//这里是过滤 只处理读取事件

if(! watchfd[i].events & EPOLLIN)

                {

                    continue;

}

 

printf("the request is comming!!\n");

parsecontent(checkfd,efd); //解析http协议头和方法

 

}

 

}

 

}

}

这里用到了epoll的几个方法,后续单独开一个系列进行阐述,今天先写核心逻辑里的主要代码。

おすすめ

転載: www.cnblogs.com/ywtt/p/12105694.html