Linux_C socket 服务器(cat ,execl功能)

客户端和web服务器交互的基本结构如下:

(1)客户端发送请求

GET filename HTTP/version

   可选参数

     空行

 (2)服务器发送应答

HTTP/version status-code status-message

附加信息

空行

内容

webserv.c

  1 /* webserv.c    a minimal web server (version 0.2)
  2  * usage : webserv portnumber
  3  */
  4 #include <stdio.h>
  5 #include <sys/types.h>
  6 #include <sys/socket.h>
  7 #include <string.h>
  8 #include <sys/stat.h>
  9 #include <netinet/in.h>
 10 #include <netdb.h>
 11
 12 int make_server_socket(int);
 13
 14 int main(int argc, char* argv[]) {
 15   int sock, fd;
 16   FILE * fpin;
 17   char request[BUFSIZ];
 18
 19   if(argc==1) {
 20     fprintf(stderr , "usage :webserv portnum.\n");
 21     exit(1);
 22   }
 23   sock=make_server_socket(atoi(argv[1]));
 24   if(sock==-1)
 25     exit(2);
 26   while(1) {
 27     /* take a call and buffer it */
 28     fd=accept(sock, NULL, NULL);
 29     fpin=fdopen(fd, "r");
 30     /* read request */
 31     fgets(request, BUFSIZ, fpin);
 32     printf("get a call ; request = %s", request);
 33     read_til_crnl(fpin);
 34     /* do what client asks */
 35     process_rq(request, fd);
 36
 37     fclose(fpin);
 38   }
 39   return 0;
 40 }
 41
 42 int make_server_socket(int portnum) {
 43   int sock;
 44   struct sockaddr_in saddr;
 45   struct hostent *hp;
 46   char hostname[BUFSIZ];
 47
 48   sock=socket(PF_INET, SOCK_STREAM, 0);
 49   if(sock==-1)
 50     return -1;
 51
 52   gethostname(hostname, BUFSIZ);
 53   hp=gethostbyname(hostname);
 54   bzero(&saddr, sizeof(saddr));
 55   bcopy((void*)hp->h_addr, (void*)&saddr.sin_addr, hp->h_length);
 56   saddr.sin_port=htons(portnum);
 57   saddr.sin_family=AF_INET;
 58
 59   if(bind(sock, (struct sockaddr*)&saddr, sizeof(saddr))!=0)
 60     return -1;
 61   if(listen(sock ,1)!=0)
 62     return -1;
 63   return sock;
 64 }
 65
 66 /**********************************************************************
 67  * read_til_crnl(FILE* )
 68  * skip over all request info until a CRNL is seen
 69  *********************************************************************/
 70 read_til_crnl(FILE* fp) {
 71   char buf[BUFSIZ];
 72   while(fgets(buf, BUFSIZ, fp)!=NULL && strcmp(buf, "\r\n")!=0)
 73     ;
 74 }
 75
 76 /*********************************************************************
 77  * process_rq(char* rq, int fd)
 78  * do what the request asks for and write reply to fd
 79  * handles request in a new process
 80  * rq is HTTP command: GET /foo/bar.html HTTP/1.0
 81  ********************************************************************/
 82 process_rq(char *rq, int fd) {
 83   char cmd[BUFSIZ], arg[BUFSIZ];
 84   /*creat a new process and return if not the child*/
 85   if(fork()!=0)
 86     return ;
 87   strcpy(arg, "./");   /* precede args with .*/
 88   if(sscanf(rq, "%s %s", cmd, arg+2)!=2)
 89     return ;
 90   if(strcmp(cmd, "GET")!=0)
 91     cannot_do(fd);
 92   else if(not_exist(arg))
 93     do_404(arg, fd);
 94   else if(isadir(arg))
 95     do_ls(arg, fd);
 96   else if(ends_in_cgi(arg))
 97     do_exec(arg, fd);
 98   else
 99     do_cat(arg, fd);
100 }
101
102
103
104 /*********************************************************
105  * the reply header thing: all functions need one
106  * if content_type is NULL then don‘t send content type
107  ********************************************************/
108 header(FILE* fp, char * content_type) {
109   fprintf(fp, "HTTP/1.0 200 OK\r\n");
110   if(content_type)
111     fprintf(fp, "Content-type: %s\r\n", content_type);
112 }
113
114 /*********************************************************
115  * simple functions first:
116  *   cannot_do(fd): unimplemented HTTP command
117  * and  do_404*(item ,fd)  no such object
118  ********************************************************/
119
120 cannot_do(fd) {
121   FILE *fp=fdopen(fd, "w");
122
123   fprintf(fp, "HTTP/1.0 501 Not Implemented\r\n");
124   fprintf(fp, "Content-type: text/plain\r\n");
125   fprintf(fp, "\r\n");
126
127   fprintf(fp, "That command is not yet implemented\r\n");
128   fclose(fp);
129 }
130
131 do_404(char* item, int fd) {
132   FILE* fp=fdopen(fd, "w");
133
134   fprintf(fp, "HTTP/1.0 404 Not Found\r\n");
135   fprintf(fp, "Content-type:text/plain\r\n");
136   fprintf(fp, "\r\n" );
137
138   fprintf(fp, "The item you requested: %s\r\nis not found\r\n", item);
139   fclose(fp);
140 }
141
142 /******************************************************************
143  * the directory listing sectoin
144  * isadir() uses stat, not_exist() uses stat
145  * do_ls runs ls. It should not
146  *****************************************************************/
147
148 isadir(char *f) {
149   struct stat info;
150   return (stat(f, &info)!=-1 && S_ISDIR(info.st_mode));
151 }
152
153 not_exist(char *f) {
154   struct stat info;
155   return (stat(f, &info)==-1);
156 }
157
158 do_ls(char *dir, int fd) {
159   FILE* fp;
160   fp=fdopen(fd, "w");
161   header(fp, "text/plain");
162   fprintf(fp, "\r\n");
163   fflush(fp);
164
165   dup2(fd, 1);
166   dup2(fd, 2);
167   close(fd);
168   execlp("ls", "ls", "-l",dir, NULL);
169   perror(dir);
170   exit(1);
171 }
172
173 /*******************************************************
174  * the cgi stuff function to check extension and
175  * one to run the program.
176  ******************************************************/
177 char * file_type(char* f) {
178   /* returns ‘extension‘ of file */
179   char *cp;
180   if((cp=strrchr(f, ‘.‘))!=NULL)
181     return cp+1;
182   return "";
183 }
184
185 ends_in_cgi(char* f) {
186   return (strcmp(file_type(f) , "cgi")==0);
187 }
188
189 do_exec(char *prog, int fd) {
190   FILE *fp;
191
192   fp=fdopen(fd, "w");
193   header(fp, NULL);
194   fflush(fp);
195   dup2(fd, 1);
196   dup2(fd, 2);
197   close(fd);
198   execl(prog, prog, NULL);
199   perror(prog);
200 }
201
202 /*******************************************************************
203  * do_cat(filename, fd)
204  * sends back contents after a header
205  ******************************************************************/
206 do_cat(char* f, int fd) {
207   char *extension = file_type(f);
208   char *content = "text/plain";
209   FILE *fpsock, *fpfile;
210   int c;
211
212   if(strcmp(extension, "html")==0)
213     content = "text/html";
214   else if(strcmp(extension, "gif")==0)
215     content = "image/gif";
216   else if(strcmp(extension, "jpg")==0)
217     content = "image/jpeg";
218   else if(strcmp(extension, "jpeg")==0)
219     content = "image/jpeg";
220
221   fpsock = fdopen(fd, "w");
222   fpfile = fopen(f, "r");
223   if(fpsock != NULL && fpfile!=NULL) {
224     header(fpsock, content);
225     fprintf(fpsock, "\r\n");
226     while((c=getc(fpfile))!=EOF)
227       putc(c, fpsock);
228     fclose(fpfile);
229     fclose(fpsock);
230   }
231   exit(0);
232 }
时间: 2024-10-11 03:33:29

Linux_C socket 服务器(cat ,execl功能)的相关文章

Linux_C socket 服务器与客户端交互程序(输入小写转换为大写)

client.c 1 /* interactionSocket/client.c 2 * 实现终端与服务器端的交互式输入输出 3 */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <unistd.h> 8 #include <sys/types.h> 9 #include <sys/socket.h> 10 #include &

利用ScktSrvr打造多功能Socket服务器

Socket服务端编程中最重要的也是最难处理的工作便是客户请求的处理和数据的接收和发送,如果每一个Socket服务器应用程序的开发都要从头到尾处理这些事情的话,人将会很累,也会浪费大量时间.试想,如果有一个通用的程序把客户请求处理和数据的接收.发送都处理好了,程序员只需要在不同的应用中对接收到的数据进行不同的解析并生成返回的数据包,再由这个通用程序将数据包传回客户端,这样,程序设计的工作将会轻松许多.  用Delphi进行过三层数据库应用开发的程序员一定对Borland公司的Borland So

如何用PHP实现Socket服务器

想要构建聊天应用,或者甚至是游戏吗?那么,socket服务器将成为你迈出的第一步.一旦你了解了创建服务器的基本功能,那么后续的优化步骤就会变得同样简单. socket服务器的工作方式是这样的,不间断地运行以等待客户端的连接.一旦客户端连接上了,服务器就会将它添加到客户名单中,然后开始等待来自客户端的消息. 不要走开,下面是完整的源代码: // Set time limit to indefinite execution set_time_limit (0); // Set the ip and

java 利用NIO建立Socket服务器

Socket的Channel在Selector上注册某一种动作,Selector通过select操作,监视所有在该Selector注册过的Channel的对应的动作,如果监测到某一对应的动作,则返回selectedKeys,自己手动取到各个SelectionKey进行相应的处理.当然NIO不仅可以接受Socket的Channel,还有文件操作等其他IO操作. AD: WOT2015 互联网运维与开发者大会 热销抢票 传统的Java 的IO,利用Socket建立服务器,接收客户端连接,一般都是为每

C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket类写了一些基于传统异步编程模型的代码(BeginSend.BeginReceive,等等)也看过很多博客的知识,在linux中有poll和epoll来实现,在windows下面 微软MSDN中也提供了SocketAsyncEventArgs这个类来

转:Socket服务器整体架构概述

Socket服务器主要用于提供高效.稳定的数据处理.消息转发等服务,它直接决定了前台应用程序的性能.我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层.业务逻辑层.会话层.数据访问层,如图: (图1) (一) 网络层 网络层主要用于侦听socket连接.创建socket.接受消息.发送消息.关闭连接.作为socket通信服务器,网络层的性能相当重要,所以我们在设计网络层时,要着重在以下几方面获得突破:最大连接数.最大并发数.秒处理消息数.如何突破呢?下面我为大家

【socket】Socket的三个功能类TCPClient、TCPListener 和 UDPClient

Socket的三个功能类TCPClient.TCPListener 和 UDPClient (转) 应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务.这些协议类建立在 System.Net.Sockets.Socket 类的基础之上,负责数据传送的细节.(也就是说TCPClient.TCPListener 和 UDPClient 类是用来简化Socket) TcpClient 和 TcpLi

(IOCP)-C#高性能Socket服务器的实现

C#高性能Socket服务器的实现(IOCP) https://www.jianshu.com/p/c65c0eb59f22 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket类写了一些基于传统异步编程模型的代码(BeginSend.BeginReceive,等等)也看过很多博客的知识,在linux中有poll和epoll来实现,在windows下面 微软MSDN中也提供了SocketAsyncEventArgs这个类来实现IOCP 地址:https://msdn.m

PHP socket 服务器框架集

1.Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询.Swoole可以广泛应用于互联网.移动通信.企业软件.网络游戏.物联网.车联网.智能家庭等领域. 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品. 2.workerman workerman是一个高性能的PHP