server模型代码示例

来源:互联网 发布:安全网络知识教育平台 编辑:程序博客网 时间:2024/05/25 23:57

简单 WEB服务器 接受GET请求,返回测试页面
<html><title>test</title><body>this is a test web page</body></html>

启动服务器:(默认全网,8888端口)
./httpserver
绑定ip
./httpserver 192.168.3.131
绑定端口
./httpserver 192.168.3.131 3333

运行实例:
root:/home/vickenyang/myserver# ls
httpserver*  httpserver.cpp  makefile
root:/home/vickenyang/myserver# make
cc -g -Wall -o httpserver httpserver.cpp
root:/home/vickenyang/myserver# ./httpserver 192.168.3.131 8888
http server start...
http server start successfully :
http server is on. Port:8888
accept request from :172.30.7.196
accept request from :172.30.7.196

root:/home/vickenyang/myserver#


先fork一堆进程,然后用竞争accept方式
./httpserversuper
./httpserversuper 192.168.3.131

 

//httpserver.cpp
#include<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<string.h>
#include
<sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
#include
<sys/ipc.h>

#define BUFFER_SIZE 65535
#define false 0
#define true 1

//http请求处理函数
//只支持GET请求
void process(int fd)
{
    
    
char buffer[BUFFER_SIZE];
    
int n;
    
const char http_error_406[] = "HTTP/1.0 406 Not Acceptable ";
    
const char http_ok[] = "HTTP/1.0 200 OK ";
    
const char http_html[] = "Content-Type: text/html ";
    
const char http_content[] = "<html><title>test</title><body>this is a test web page</body></html>";
    
const char http_content_length[] = "Content=Length:";
    
const char http_content_close[] = "Connection: close ";
    
    
if((n = read(fd,buffer,BUFFER_SIZE))>0)
    
{
        
//printf("accept:%s",buffer);
        if(strncmp(buffer,"GET",3)==0)
        
{
            
int p = 0;
            p 
+= sprintf(buffer+p,http_ok);
            p 
+= sprintf(buffer+p,http_html);
            p 
+= sprintf(buffer+p,http_content_length);
            p 
+= sprintf(buffer+p,"%d ",strlen(http_content));
            p 
+= sprintf(buffer+p,http_content_close);
            p 
+= sprintf(buffer+p," ");
            p 
+= sprintf(buffer+p,http_content);
            write(fd,buffer,p);
            
//printf("send:%s",buffer);
        }

        
else
        
{
            write(fd,http_error_406,strlen(http_error_406));
        }

        close(fd);
    }

}


int main(int argc,char ** argv)
{
    
int port = 8888;
    
char * ip ;
    ip 
= "0.0.0.0";
    
if(argc==2)
    
{
        ip 
= argv[1];
    }

    
if(argc==3)
    
{
        ip 
= argv[1];
        port 
= atoi(argv[2]);
    }

    
    
int listenfd,connfd;
    
struct sockaddr_in servaddr,cliaddr;
    socklen_t len;
    pid_t pid;
    
    
if((listenfd = socket(AF_INET,SOCK_STREAM,0))<0)
    
{
        printf(
"http server error! ");
        exit(
1);
    }

    printf(
"http server start... ");

    bzero(
&servaddr,sizeof(servaddr));
    servaddr.sin_family 
= AF_INET;
    servaddr.sin_addr.s_addr 
= inet_addr(ip);
    servaddr.sin_port 
= htons(port);
    
if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
    
{
        printf(
"http server bind %d error! ",port);
        exit(
1);
    }

    
if(listen(listenfd,20)<0)
    
{
        printf(
"http server listen error! ");
        exit(
1);
    }

    
    printf(
"http server start successfully : ");
    printf(
"http server is on. Port:%d ",ntohs(servaddr.sin_port));
    fflush(stdout);

    
//并发服务器
    while(true)
    
{
        len 
= sizeof(cliaddr);
        
static int accept_max_error = 9;
        
if((connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len))<0)
        
{
            accept_max_error 
--;
            printf(
"http server accept error! ");
            fflush(stdout);
            
if(accept_max_error<0)
            
{
                exit(
1);
            }

            
else
            
{
                
continue;
            }

        }

        
if((pid = fork())<0)
        
{
            printf(
"fork error! ");
            fflush(stdout);
            
continue;
        }

        
if(pid==0)
        
{
            
//子进程,处理请求
            close(listenfd);
            
//处理请求
            process(connfd);
            exit(
0);
        }

        
else
        
{
            
//父进程
            printf("accept request from :%s ",inet_ntoa(cliaddr.sin_addr));
            fflush(stdout);
            close(connfd);
        }

    }

    
}

 

 

#include<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<string.h>
#include
<sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
#include
<fcntl.h>
#include
<sys/stat.h>
#include
<sys/msg.h>
#include
<sys/ipc.h>
//httpserversuper.cpp
#define BUFFER_SIZE 65535
#define MSG_FILE "server.msg"
#define false 0
#define true 1

//http请求处理函数
//只支持GET请求
void process(int fd,int msg)
{

    
char buffer[BUFFER_SIZE];
    
int n;
    
//const char http_error_406[] = "HTTP/1.0 406 Not Acceptable ";
    const char http_ok[] = "HTTP/1.0 200 OK ";
    
const char http_html[] = "Content-Type: text/html ";
    
const char http_content[] = "<html><title>test</title><body>this is a test web page</body></html>";
    
const char http_content_length[] = "Content=Length:";
    
const char http_content_close[] = "Connection: close ";
    
    
if((n = read(fd,buffer,BUFFER_SIZE))>0)
    
{
        
//printf("accept:%s",buffer);
        
//if(strncmp(buffer,"GET",3)==0)
        {
            
int p = 0;
            p 
+= sprintf(buffer+p,http_ok);
            p 
+= sprintf(buffer+p,http_html);
            p 
+= sprintf(buffer+p,http_content_length);
            p 
+= sprintf(buffer+p,"%d ",strlen(http_content));
            p 
+= sprintf(buffer+p,http_content_close);
            p 
+= sprintf(buffer+p," ");
            
//p += sprintf(buffer+p,http_content);
            p += sprintf(buffer+p,"<html><body>this is from pid : %d</body></html>",msg);
            write(fd,buffer,p);
            
//printf("send:%s",buffer);
        }

        
//else
        
//{
        
//    write(fd,http_error_406,strlen(http_error_406));
        
//}
        close(fd);
    }

}



int main(int argc,char ** argv)
{
    
    
int port = 8888;
    
char * ip ;
    ip 
= "0.0.0.0";
    
if(argc==2)
    
{
        ip 
= argv[1];
    }

    
if(argc==3)
    
{
        ip 
= argv[1];
        port 
= atoi(argv[2]);
    }

    
    
int listenfd,connfd;
    
struct sockaddr_in servaddr,cliaddr;
    socklen_t len;
    pid_t pid;
    
    
if((listenfd = socket(AF_INET,SOCK_STREAM,0))<0)
    
{
        fprintf(stderr,
"http server error! ");
        exit(
1);
    }

    fprintf(stdout,
"http server start... ");

    bzero(
&servaddr,sizeof(servaddr));
    servaddr.sin_family 
= AF_INET;
    servaddr.sin_addr.s_addr 
= inet_addr(ip);
    servaddr.sin_port 
= htons(port);
    
if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
    
{
        fprintf(stderr,
"http server bind %d error! ",port);
        exit(
1);
    }

    
if(listen(listenfd,20)<0)
    
{
        fprintf(stderr,
"http server listen error! ");
        exit(
1);
    }

    
    fprintf(stdout,
"http server start successfully : ");
    fprintf(stdout,
"http server is on. Port:%d ",ntohs(servaddr.sin_port));
    fflush(stdout);

    
//预先fork多个进程
    for(int t=0;t<20;t++)
    
{
        
if((pid = fork())==0)
        
{
             
while(true)
            
{
                
//测试竞争是否有效
                
//sleep(t);

                len 
= sizeof(cliaddr);
                
if((connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len))<0)
                
{
                    fprintf(stderr,
"http server accept error! ");
                    fflush(stderr);
                    exit(
1);
                }

                process(connfd,t);
                fprintf(stdout,
"accept request from :%s ",inet_ntoa(cliaddr.sin_addr));
                fflush(stdout);
                close(connfd);
            }

        }

    }

     
while(true)
    
{
        len 
= sizeof(cliaddr);
        
if((connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len))<0)
        
{
            fprintf(stderr,
"http server accept error! ");
            fflush(stderr);
            exit(
1);
        }

        
//父进程
        process(connfd,4);
        fprintf(stdout,
"accept request from :%s ",inet_ntoa(cliaddr.sin_addr));
        fflush(stdout);
        close(connfd);
    }

}

原创粉丝点击