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

相关推荐

    Linux服务器负载均衡的研究与实现.pdf

    Linux服务器负载均衡是指通过某种负载分担技术将大量客户请求均匀分配到通过网络连接的一组服务器,由多个服务器并发响应客户请求、共同完成工作任务。负载均衡技术可以有效地提高系统性能、提高系统可用性和可伸缩...

    阿里云服务器ECS建站教程web环境搭建

    3. Docker部署:Docker是一个开源的应用容器引擎,可以将应用及其环境打包成一个轻量级的容器,实现应用的快速部署和迁移。 4. WDCP系统部署:WDCP是一套Web控制面板,能够通过Web界面方便地管理服务器资源,包括...

    Web.zip

    在Windows或Linux系统中,压缩工具会将整个目录结构打包成一个ZIP文件,因此"Web"可能是一个顶级目录,里面包含了所有与Web站点相关的子文件夹和文件。常见的文件结构可能包括以下几个部分: 1. **index.html** - ...

    Web服务技术在嵌入式网络监控中的应用.pdf

    1. 服务集成:将多个监控设备或服务整合成一个统一的Web服务接口,便于管理和控制。 2. 安全增强:通过Web服务的安全机制,如SSL/TLS加密,提高数据传输的安全性。 3. 实时性优化:Web服务的实时响应能力可以提升...

    Ext3写的一个用servlet的例子

    将Ext3和servlet结合,我们可以理解这是一个关于如何在使用Ext3文件系统的Linux服务器上部署和运行含有servlet的Java Web应用的示例。 在Java Web开发中,Servlet是核心组件之一,它们接收来自客户端(如浏览器)的...

    服务器基本知识—服务器核心技术介绍

    3. **RAID**:独立磁盘冗余阵列,通过将多个物理磁盘驱动器组合成一个逻辑单元,以提高数据的可用性和性能。 4. **SAN/NAS**:存储区域网络(SAN)和网络附加存储(NAS)是两种常见的数据存储解决方案。SAN主要用于提供...

    java web 开发经典

    3. **编译 JSP**:如果 JSP 文件是第一次被请求,则会被编译成一个 Java 类文件。 4. **执行 Servlet**:编译后的 JSP 被执行,生成动态内容。 5. **返回结果**:动态生成的内容被发送回客户端浏览器。 ##### JSP ...

    [整站程序]与非IT数码产品门户程序_ityesno.rar

    9. **部署与维护**:程序的部署通常在Linux服务器上,使用Apache或Nginx作为Web服务器。持续集成/持续部署(CI/CD)工具如Jenkins可以帮助自动化发布流程。 10. **测试**:单元测试、集成测试和系统测试确保程序的...

    java开源包11

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

    基于web的网络购物系统发布.zip

    "zip"或"rar"格式是常见的文件归档方式,用于将多个文件打包成一个文件以便于传输和存储。发布这一动作通常意味着该系统已经完成开发和测试,准备在生产环境中运行。 【标签】:“” 由于没有提供具体的标签,我们...

    php入门教程[基础]

    在Web程序的工作流程中,用户通过浏览器向服务器发送HTTP请求,服务器接收到请求后,会调用相应的应用程序(如PHP解析器)处理请求,生成响应内容,再将这些内容以HTTP响应的形式返回给用户。这一过程涉及到了TCP/IP...

    boa-0.94.13.tar.gz

    "boa-0.94.13.tar.gz" 是一个开源Web服务器软件Boa的源码包。Boa是一款轻量级的HTTP服务器,适用于嵌入式设备、个人电脑或小型服务器环境,它以其小巧、简单和易于配置而受到一些用户的青睐。这个版本号0.94.13表示...

    jsp开发体系和配置.ppt

    JSP在服务器端被转换成一个JavaServlet,然后编译成.class文件执行。这个过程包括以下几个步骤: 1. **翻译阶段**:当JSP页面首次被请求时,服务器将JSP页面转换为Java源代码(.java文件),这个源代码包含了HTML和...

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

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

    HttpURLConnection读取本地目录上传远程服务器

    文件`jyWebClient`可能是一个自定义的Web客户端实现,它封装了上述的上传逻辑;而`jyWebService`可能是一个服务端接口,接收并处理来自`jyWebClient`的上传请求。 总的来说,这个场景涉及到了Java网络编程、HTTP...

    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 源码的插件,提供语法高亮...

    LVS集群系统及其在网络课程平台中的应用.pdf

    集群技术是通过将多台独立服务器联结成一个单一的逻辑系统,以提供高可用性和可伸缩性服务。LVS属于负载均衡集群,其目标是均匀分配网络流量和应用程序处理负载,确保服务的连续性和效率。LVS尤其适合需要处理大量...

    apache-tomcat-7.0.20.tar

    Apache Tomcat 7.0.20 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。这个版本的Tomcat是Apache Tomcat服务器的一个重要里程碑,提供了许多增强的...

Global site tag (gtag.js) - Google Analytics