`
M_ittrue
  • 浏览: 75209 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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;
}
 只是一个练手程序,做个纪念,有待更多的学习与完善。
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包3

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包4

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包1

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包11

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包2

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包6

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包5

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包10

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包8

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包7

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包9

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包101

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    Java资源包01

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    超级有影响力霸气的Java面试题大全文档

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    Tcl_TK编程权威指南pdf

    我一直使自己在很大程度上保持着一个Tcl程序员的角色,而我们工作组中的其他人员则埋头于Tcl本身的C语言实现。我创建的应用程序有HTML编辑器、EMAIL比用户接口程序、Web服务器以及用户数据库,我们的商务应用就建立...

Global site tag (gtag.js) - Google Analytics