Linux 简单的web服务器
来源:互联网 发布:人体解剖软件中文版 编辑:程序博客网 时间:2024/06/11 12:04
Linux 简单的web服务器
最近写了一个简单的web服务器程序,鉴于时间短,代码有很多不妥的地方,不条理,也有些漏洞。只实现了图片、文字的基本功能,也没有对可执行文件代码的实现。记录下来,单纯为以后做个参考。高手勿喷。
同一目录下文件如上:
index.html源码如下:
<html><head><title>Test Page</title></head><body> <p>seven</p> <img src='mypic.jpg'></body></html>
myhttp.conf为配置文件:
PORT:8000DIRECTORY:/home/li/my_study/UNIX_GAOJI/myhttp
mypic.jpg是一张图片
server.c
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <arpa/inet.h>#define MAXLINE 80int mycp(int fd_src,int fd_des);void text_picture(char *buf,char *ask_dir);int main(void){struct sockaddr_in servaddr,cliaddr;FILE *fp;int fd,listenfd,connfd;long port;char dir[50],q[50],buf[MAXLINE],ask_dir[50];char str[INET_ADDRSTRLEN];char *right1="HTTP/1.1 200 OK\r\n";char *right2="Content-Type:text/html\r\n";char *fault1="HTTP/1.1 404 Not Found\r\n";char *fault2="Content-Type:text/html\r\n"; char *right3="Content-Type: image/jpg\r\n";char *p=NULL;int opt=1,n;socklen_t cliaddr_len;pid_t pid;listenfd=socket(AF_INET,SOCK_STREAM,0);setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));fp=fopen("myhttp.conf","r");if(fp==NULL){printf("fopen error\n");return -1;}fscanf(fp,"PORT:%ld\nDIRECTORY:%s\n",&port,dir);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(port);bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));listen(listenfd,20);printf("Accepting connections ...\n");while(1){strcpy(q,dir);cliaddr_len=sizeof(cliaddr);connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);read(connfd,buf,MAXLINE);printf("received from %s at PORT %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),ntohs(cliaddr.sin_port));text_picture(buf,ask_dir);if((strcmp(ask_dir,"/"))==0){strcat(ask_dir,"index.html");strcat(q,ask_dir); fd=open(q,O_RDONLY);if(fd<0){write(connfd,fault1,strlen(fault1)); write(connfd,fault2,strlen(fault2));}else{write(connfd,right1,strlen(right1)); write(connfd,right2,strlen(right2)); write(connfd,"\r\n",2);mycp(fd,connfd);close(fd);}bzero(ask_dir,50);bzero(q,50);close(connfd);}if((strcmp(ask_dir,"/mypic.jpg"))==0){ strcat(q,ask_dir); fd=open(q,O_RDONLY); if(fd<0){ write(connfd,fault1,strlen(fault1)); write(connfd,fault2,strlen(fault2)); } else{ write(connfd,right1,strlen(right1)); write(connfd,right3,strlen(right3));write(connfd,"\r\n",2); mycp(fd,connfd); close(fd); } bzero(ask_dir,50); bzero(q,50); close(connfd);}}return 0;}int mycp(int fd_src,int fd_des){ int sret,dret; char str[128]; char *p; bzero(str,128); while((sret=read(fd_src,str,128))>0){ p=str; while(sret){ dret=write(fd_des,p,sret); sret=sret-dret; p=p+dret; } bzero(str,128); } return 0;}void text_picture(char *buf,char *ask_dir){int i=4;int j=0;for(i=4;buf[i]!=' ';i++){ ask_dir[j]=buf[i]; j++; } ask_dir[j]='\0';}
- Linux 简单的web服务器
- linux 一个简单的WEB服务器
- [linux] c 实现简单的web服务器
- 用C语言实现的简单Web服务器(Linux)
- 用C语言实现的简单Web服务器(Linux)
- 用C语言实现的简单Web服务器(Linux)
- linux C学习之实现简单的web服务器
- 一个简单的Web服务器
- 简单的web服务器:shhttpd
- 最简单的web服务器
- 简单的web服务器实现
- 简单的Web服务器模型
- 实现简单的web服务器
- 实现简单的Web服务器
- 搭建简单的Web服务器
- 一个简单的web服务器
- 简单的web服务器原型
- 编写简单的WEB服务器
- pthread创建RR线程
- Struts2 高危漏洞修复方案 (S2-016/S2-017)
- IOS开发-循序渐进学开发
- 《Oracle Applications DBA 基础》 - 引子
- 16点高手必备
- Linux 简单的web服务器
- Android中View的坐标矩形获取
- JavaScript的self和this使用小结
- 64-Bit Transition Guide for Cocoa Touch
- linux内核奇遇记之md源代码解读之七阵列同步一
- 笔记本怎么设置WIfi热点
- Html之表格_宽度_内对齐_实例
- 使用glue自动生成sprite
- JavaFX 3D部分介绍(4) Materials