简单 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
#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 < 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);
}
}