当前位置: 代码迷 >> Web前端 >> linux c兑现的简单web响应程序(会完善成一个简单web服务器)
  详细解决方案

linux c兑现的简单web响应程序(会完善成一个简单web服务器)

热度:438   发布时间:2013-01-18 10:22:42.0
linux c实现的简单web响应程序(会完善成一个简单web服务器)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define LINE_LEN 25
//配置文件存储结构
struct httppd{
    char Port[10];
    char Directory[20];
    int listenfd;//服务器socket文件监听句柄
};
//客户端请求信息结构体
struct clientInfo{
    struct sockaddr_in cliaddr;
    int clifd;
};
//读取配置文件,暂时只是一个服务目录跟端口
void readDir  (struct httppd *conf)
{
    int fd;
    FILE *file = fopen("/etc/myhttp.conf","r");
    if(file == NULL)
    {
        perror("fopen error.");
        exit(1);
    }
    bzero(conf,sizeof(struct httppd));
    fscanf(file,"%s",conf->Port);
    fscanf(file,"%s",conf->Directory);
    strcpy(conf->Port,strchr(conf->Port,'=')+1);
    strcpy(conf->Directory,strchr(conf->Directory,'=')+1);
    fclose(file);
}
void *handlClient(void *connfd);
void sendMsg(void *cinfo);
//启动服务器
void startServer(struct httppd *conf)
{
    struct sockaddr_in servaddr,cliaddr;
    int listenfd,connfd;
    //建入socket文件句柄
    listenfd = socket(AF_INET,SOCK_STREAM,0);
    conf->listenfd = listenfd;
    //初始化服务器信息
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(atoi(conf->Port));   
    if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1) 
    {
        perror("bind error");
        exit(0);
    }
    listen(listenfd,20);
    printf("Accepting connections.......\n");
    socklen_t cliaddr_len;
    while(1)
    {
        cliaddr_len = sizeof(cliaddr);
        connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);
        struct clientInfo cinfo;
        cinfo.cliaddr = cliaddr;
        cinfo.clifd = connfd;
//使用多线路程服务客户端请求,有待完善
        pthread_t client;
        pthread_create(&client,NULL,handlClient,&cinfo);
        pthread_join(client,NULL);
        close(connfd);       
    }
}
#define MAXLINE 80
//处理客户端请求
void *handlClient(void *info)
{
    struct clientInfo cinfo = *(struct clientInfo *)info;
    char buf[MAXLINE],n;
    n = read(cinfo.clifd,buf,MAXLINE);
    if(n < 0)
    {
        perror("read error....");
        exit(0);
    }
    printf("Recvfrom information is %s\n",buf);
    sendMsg(&cinfo);
}
//响应客户端请求
void sendMsg(void *info)
{
    struct clientInfo cinfo = *(struct clientInfo *)info;
    FILE *file = fopen("/var/www/index.html","r");
    char buf[1024];
    fread(buf,1024,1,file);
    //fgets(buf,1024,file);
    //printf("index.html %s\n",buf);
    sendto(cinfo.clifd,buf,1024,0,(struct sockaddr *)&(cinfo.cliaddr),sizeof(cinfo.cliaddr));
    fclose(file);
}
//程序入口
int main(int argc,char *argv[])
{
    struct httppd conf;
    readDir(&conf);
    startServer(&conf);
    close(conf.listenfd);
    return 0;
}
?只是一个练手程序,做个纪念,有待更多的学习与完善。