Linux下简易web服务器实现

今天突然对http的web服务器感兴趣了,就研究了一下,发现linux下的web服务器就是一个socket编程的服务器端,而我们用的ie,chrome等浏览器就是客户端,只不过发送和接收数据按照http网页格式,就相当于对数据进行了封装,相当于加上了文件头和文件尾等一些规定的东西罢了。下面有一个简单的web服务器程序,网上找的,用了,感觉不错,分享一下。

当今很多http协议的服务器已经成熟化比如apache iis nginx 想想这些运行在服务器上的程序,利用tcp原理进行http协议的页面元素传输,这里有个简易原理程序。

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
 
main()
{
    int sk1,sk2;
    int len = 0;
    char buff[4096];
    struct sockaddr_in cli_addr;
    char msgret[4096];
    memset( msgret, 0x00, sizeof(msgret) );
 
    if( (sk1=socket(AF_INET, SOCK_STREAM, 0)) < 0 )
    printf( "socket failed\n" );
    printf( "creat socket success: %d\n", sk1 );
 
    struct sockaddr_in sa;
    memset( &sa, 0x00, sizeof(sa) );
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr( "192.168.0.111" );//服务器的ip地址,这里必须和你的电脑的相同
    sa.sin_port = htons( 13800 );//端口号

    if( bind(sk1, (struct sockaddr*)&sa, sizeof(sa)) < 0 )
    printf( "bind socket failed\n" );
 
    listen( sk1, 100 );
 
    while( 1 )
    {
        len = sizeof(cli_addr);
        sk2 = accept( sk1, (struct sockaddr*)&sa, (socklen_t*)&len );
        if( sk2 < 0 )
            printf( "create accept socket failed\n" );
        else
        {
            printf( "accept socket: %d\n", sk2 );
            memset( buff, 0x00, sizeof(buff) );
            len = read( sk2, buff, 4096);
            printf( "msg recv: %s\n", buff );
            sprintf( msgret, "HTTP/1.1 200 OK\n"
                             "Date: Fri, 02 Mar 2012 01:59:03 GMT\n"
                             "Server: Apache"
                             "Location: http://www.sina.com.cn/\n"
                             "Cache-Control: max-age=60\n"
                             "Expires: Fri, 02 Mar 2012 02:00:03 GMT\n"
                             "Vary: Accept-Encoding\n"
                             "Content-Length: 231\n"
                             "Content-Type: text/html; charset=iso-8859-1\n"
                             "X-Cache: MISS from xd33-82.HP08040021.sina.com.cn\n"
                             "Connection: close\n\n"
                             "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
                             "<html><head>\n"
                             "<title>title test</title>\n"
                             "</head><body>\n"
                             "<h1>test body</h1>\n"
                             "<p>Hello,I am web server!</p>\n"//打印的文字内容
                             "</body></html>" );
            len = send( sk2, msgret, sizeof(msgret), 0 );
            if( len <= 0 )
            {
                printf( "send failed\n" );
            }
        }
    }
}
访问web服务器就相当于用客户端即浏览器采用http协议连接访问服务器端,我们看到网页就相当于服务器端将本地的网页文件发送到你的电脑,你的电脑浏览器作为客户端将网页显示出来!

在浏览器运行结果如图所示


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值