简单Web服务器
来源:互联网 发布:淘宝客代购是什么意思 编辑:程序博客网 时间:2024/05/18 01:45
Code:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <pthread.h>#define BUF_SIZE 1024#define SMALL_BUF 100void* request_handler(void* arg);void send_data(FILE* fp,char* ct,char* file_name);char* content_type(char* file);void send_error(FILE* fp);void error_handling(char* message);int main(int argc,char *argv[]){ int serv_sock,clnt_sock; struct sockaddr_in serv_adr,clnt_adr; int clnt_adr_size; char buf[BUF_SIZE]; pthread_t t_id; if (argc != 2) { printf("Usage : %s <port>\n",argv[0]); exit(1); } serv_sock = socket(PF_INET,SOCK_STREAM,0); memset(&serv_adr,0,sizeof(serv_adr)); serv_adr.sin_family = AF_INET; serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); serv_adr.sin_port = htons(atoi(argv[1])); if (bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1) { error_handling("bind() error"); } if (listen(serv_sock,20) == -1) { error_handling("listen() error"); } while (1) { clnt_adr_size = sizeof(clnt_adr); clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_adr,&clnt_adr_size); printf("connect request: %s:%d\n",inet_ntoa(clnt_adr.sin_addr),ntohs(clnt_adr.sin_port)); pthread_create(&t_id,NULL,request_handler,&clnt_sock); pthread_detach(t_id); } close(serv_sock); return 0;}void* request_handler(void* arg){ int clnt_sock = *((int*)arg); char req_line[SMALL_BUF]; FILE* clnt_read; FILE* clnt_write; char method[10]; char ct[15]; char file_name[30]; clnt_read = fdopen(clnt_sock,"r"); clnt_write = fdopen(dup(clnt_sock),"w"); fgets(req_line,SMALL_BUF,clnt_read); if(strstr(req_line,"HTTP/") == NULL) { send_error(clnt_write); fclose(clnt_read); fclose(clnt_write); return; } strcpy(method,strtok(req_line," /")); strcpy(file_name,strtok(NULL," /")); strcpy(ct,content_type(file_name)); if (strcmp(method,"GET") == 0) { send_error(clnt_write); fclose(clnt_read); fclose(clnt_write); return ; } fclose(clnt_read); send_data(clnt_write,ct,file_name);}void send_data(FILE* fp,char* ct,char* file_name){ char protocol[] = "HTTP/1.0 200 ok\r\n"; char server[] = "Server:Linux Web Server \r\n"; char cnt_len[] = "Connect-length:2048\r\n"; char cnt_type[SMALL_BUF]; char buf[BUF_SIZE]; FILE* send_file; sprintf(cnt_type,"connect-type:%s\r\n\r\n",ct); send_file = fopen(file_name,"r"); if (send_file == NULL) { send_error(fp); return; } fputs(protocol,fp); fputs(server,fp); fputs(cnt_len,fp); fputs(cnt_type,fp); while (fgets(buf,BUF_SIZE,send_file)!=NULL) { fputs(buf,fp); fflush(fp); } fflush(fp); fclose(fp);}char* content_type(char* file){ char extension[SMALL_BUF]; char file_name[SMALL_BUF]; strcpy(file_name,file); strtok(file_name,"."); strcpy(extension,strtok(NULL,".")); if (!strcmp(extension,"html")||!strcmp(extension,"htm")) return "text/html"; else return"text/plain";}void send_error(FILE* fp){ char protocol[]="HTTP/1.0 400 Bad Request\r\n"; char server[] = "Server ;Linux Web Server \r\n"; char cnt_len[] = "Connect-length:2048\r\n"; char cnt_type[] = "Content-type:text/html\r\n\r\n"; char content[] = "<html><head><title>NetWork</title></head>" "<body><font size+=5> <br> error!!!!!!!!!!!" "</font></body></html>"; fputs(protocol,fp); fputs(server,fp); fputs(cnt_len,fp); fputs(cnt_type,fp); fflush(fp);}void error_handling(char* message){ fputs(message,stderr); fputc('\n',stderr); exit(1);}
0 0
- 简单WEB服务器源码
- [ java ] 简单web服务器
- 简单web服务器
- Web服务器简单介绍
- 简单Web服务器
- 一个简单的Web服务器
- C#实现简单WEB服务器
- 编写简单多线程web服务器
- 简单Java web服务器代码
- 简单的web服务器:shhttpd
- C#实现简单WEB服务器
- 模拟web服务器简单功能
- 简单web服务器防火墙规则
- 最简单的web服务器
- 简单的web服务器实现
- 简单的Web服务器模型
- Linux 简单的web服务器
- c#实现简单Web服务器
- 配置自己的spec文件
- Jquery的容器转换为对象,对象转换为容器
- 中山大学南方一号集群系统安装ABySS 1.9.0
- Android 自定义控件 时钟的实现
- 暑假集训 8.11-2 树结构练习——判断给定森林中有多少棵树 sdut2198 并查集
- 简单Web服务器
- 手把手教你给一个iOS app配置多个环境变量
- linux -目录结构
- airflow详细配置说明
- 使用Masonry的时候进行updateConstraints没有效果
- web.xml中context-param,listener等作用及加载过程
- 轻松搞定二叉树面试题
- 二级列表ExpandableListView的使用
- ABySS使用文档