socket通信之http-server
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
-
- #define DEFAULTIP "192.168.1.33"
- #define DEFAULTPORT "80"
- #define DEFAULTBACK "10"
- #define DEFAULTDIR "/home"
- #define DEFAULTLOG "/tmp/http-server.log"
-
- void prterrmsg(char *msg);
- #define prterrmsg(msg) { perror(msg); abort(); }
- void wrterrmsg(char *msg);
- #define wrterrmsg(msg) { fputs(msg, logfp); fputs(strerror(errno), logfp);fflush(logfp); abort(); }
-
- void prtinfomsg(char *msg);
- #define prtinfomsg(msg) { fputs(msg, stdout); }
- void wrtinfomsg(char *msg);
- #define wrtinfomsg(msg) { fputs(msg, logfp); fflush(logfp);}
-
- #define MAXBUF 1024
-
- char buffer[MAXBUF + 1];
- char *host = 0;
- char *port = 0;
- char *back = 0;
- char *dirroot = 0;
- char *logdir = 0;
- unsigned char daemon_y_n = 0;
- FILE *logfp;
-
- #define MAXPATH 150
-
- char *dir_up(char *dirpath)
- {
- static char Path[MAXPATH];
- int len;
-
- strcpy(Path, dirpath);
- len = strlen(Path);
- if (len > 1 && Path[len - 1] == '/')
- len--;
- while (Path[len - 1] != '/' && len > 1)
- len--;
- Path[len] = 0;
- return Path;
- }
-
- void AllocateMemory(char **s, int l, char *d)
- {
- *s = malloc(l + 1);
- bzero(*s, l + 1);
- memcpy(*s, d, l);
- }
-
-
-
- void GiveResponse(FILE * client_sock, char *Path)
- {
- struct dirent *dirent;
- struct stat info;
- char Filename[MAXPATH];
- DIR *dir;
- int fd, len, ret;
- char *p, *realPath, *realFilename, *nport;
-
- len = strlen(dirroot) + strlen(Path) + 1;
- realPath = malloc(len + 1);
- bzero(realPath, len + 1);
- sprintf(realPath, "%s/%s", dirroot, Path);
-
- len = strlen(port) + 1;
- nport = malloc(len + 1);
- bzero(nport, len + 1);
- sprintf(nport, ":%s", port);
-
-
- if (stat(realPath, &info)) {
- fprintf(client_sock,
- "HTTP/1.1 200 OK\r\nServer: DAS by Chengang\r\nConnection: close\r\n\r\n%d - %s"
- "Linux 下目录访问服务器
"
- "
", errno,
- strerror(errno));
- fprintf(client_sock,
- "
请向管理员咨询为何出现如下错误提示:\n%s %s",
- Path, strerror(errno));
- goto out;
- }
-
- if (S_ISREG(info.st_mode)) {
- fd = open(realPath, O_RDONLY);
- len = lseek(fd, 0, SEEK_END);
- p = (char *) malloc(len + 1);
- bzero(p, len + 1);
- lseek(fd, 0, SEEK_SET);
- ret = read(fd, p, len);
- close(fd);
- fprintf(client_sock,
- "HTTP/1.1 200 OK\r\nServer: DAS by Chengang\r\nConnection: keep-alive\r\nContent-type: application
- dir = opendir(realPath);
- fprintf(client_sock,
- "HTTP/1.1 200 OK\r\nServer: DAS by Chengang\r\nConnection: close\r\n\r\n%s"
- "Linux 下目录访问服务器
"
- "
", Path);
- fprintf(client_sock,
- "目录 %s\n",
- Path);
- fprintf(client_sock,
- "
名称 | 大小 | 修改时间 |
\n");
- if (dir == 0) {
- fprintf(client_sock,
- "
%s",
- strerror(errno));
- return;
- }
-
- while ((dirent = readdir(dir)) != 0) {
- if (strcmp(Path, "/") == 0)
- sprintf(Filename, "/%s", dirent->d_name);
- else
- sprintf(Filename, "%s/%s", Path, dirent->d_name);
- fprintf(client_sock, "
");
- len = strlen(dirroot) + strlen(Filename) + 1;
- realFilename = malloc(len + 1);
- bzero(realFilename, len + 1);
- sprintf(realFilename, "%s/%s", dirroot, Filename);
- if (stat(realFilename, &info) == 0) {
- if (strcmp(dirent->d_name, "..") == 0)
- fprintf(client_sock,
- "
(parent) | ",
- host, atoi(port) == 80 ? "" : nport,
- dir_up(Path));
- else
- fprintf(client_sock,
- "
%s | ",
- host, atoi(port) == 80 ? "" : nport, Filename,
- dirent->d_name);
- if (S_ISDIR(info.st_mode))
- fprintf(client_sock, "
目录 | ");
- else if (S_ISREG(info.st_mode))
- fprintf(client_sock, "
%d | ", info.st_size);
- else if (S_ISLNK(info.st_mode))
- fprintf(client_sock, "
链接 | ");
- else if (S_ISCHR(info.st_mode))
- fprintf(client_sock, "
字符设备 | ");
- else if (S_ISBLK(info.st_mode))
- fprintf(client_sock, "
块设备 | ");
- else if (S_ISFIFO(info.st_mode))
- fprintf(client_sock, "
FIFO | ");
- else if (S_ISSOCK(info.st_mode))
- fprintf(client_sock, "
Socket | ");
- else
- fprintf(client_sock, "
(未知) | ");
- fprintf(client_sock, "
%s | ", ctime(&info.st_ctime));
- }
- fprintf(client_sock, "
\n");
- free(realFilename);
- }
- fprintf(client_sock, "