-
プロジェクト名:HttpServerをサーバー
- プロジェクト構造
- 知識の説明
- スタートプログラム開発
- コアプログラムの開発
- プロジェクト構造
三つのファイル、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的几个方法,后续单独开一个系列进行阐述,今天先写核心逻辑里的主要代码。