Exemple #1
0
    int main(int argc, char **argv)
    {
        struct sockaddr_in addr;
        int sock_fd, addrlen;

        /* 获得程序工作的参数,如 IP 、端口、监听数、网页根目录、目录存放位置等 */
        getoption(argc, argv);

        if (!host) {
            addrlen = strlen(DEFAULTIP);
            AllocateMemory(&host, addrlen, DEFAULTIP);
        }
        if (!port) {
            addrlen = strlen(DEFAULTPORT);
            AllocateMemory(&port, addrlen, DEFAULTPORT);
        }
        if (!back) {
            addrlen = strlen(DEFAULTBACK);
            AllocateMemory(&back, addrlen, DEFAULTBACK);
        }
        if (!dirroot) {
            addrlen = strlen(DEFAULTDIR);
            AllocateMemory(&dirroot, addrlen, DEFAULTDIR);
        }
        if (!logdir) {
            addrlen = strlen(DEFAULTLOG);
            AllocateMemory(&logdir, addrlen, DEFAULTLOG);
        }

        printf
            ("host=%s port=%s back=%s dirroot=%s logdir=%s %s是后台工作模式(进程ID:%d)\n",
             host, port, back, dirroot, logdir, daemon_y_n?"":"不", getpid());

        /* fork() 两次处于后台工作模式下 */
        if (daemon_y_n) {
            if (fork())
                exit(0);
            if (fork())
                exit(0);
            close(0), close(1), close(2);
            logfp = fopen(logdir, "a+");
            if (!logfp)
                exit(0);
        }

        /* 处理子进程退出以免产生僵尸进程 */
        signal(SIGCHLD, SIG_IGN);

        /* 创建 socket */
        if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
            if (!daemon_y_n) {
                prterrmsg("socket()");
            } else {
                wrterrmsg("socket()");
            }
        }

        /* 设置端口快速重用 */
        addrlen = 1;
        setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &addrlen,
                   sizeof(addrlen));

        addr.sin_family = AF_INET;
        addr.sin_port = htons(atoi(port));
        addr.sin_addr.s_addr = inet_addr(host);
        addrlen = sizeof(struct sockaddr_in);
        /* 绑定地址、端口等信息 */
        if (bind(sock_fd, (struct sockaddr *) &addr, addrlen) < 0) {
            if (!daemon_y_n) {
                prterrmsg("bind()");
            } else {
                wrterrmsg("bind()");
            }
        }

        /* 开启临听 */
        if (listen(sock_fd, atoi(back)) < 0) {
            if (!daemon_y_n) {
                prterrmsg("listen()");
            } else {
                wrterrmsg("listen()");
            }
        }
        while (1) {
            int len;
            int new_fd;
            addrlen = sizeof(struct sockaddr_in);
            /* 接受新连接请求 */
            new_fd = accept(sock_fd, (struct sockaddr *) &addr, &addrlen);
            if (new_fd < 0) {
                if (!daemon_y_n) {
                    prterrmsg("accept()");
                } else {
                    wrterrmsg("accept()");
                }
                break;
            }
            bzero(buffer, MAXBUF + 1);
            sprintf(buffer, "连接来自于: %s:%d\n",
                    inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
            if (!daemon_y_n) {
                prtinfomsg(buffer);
            } else {
                wrtinfomsg(buffer);
            }
            /* 产生一个子进程去处理请求,当前进程继续等待新的连接到来 */
            if (!fork()) {
                bzero(buffer, MAXBUF + 1);
                if ((len = recv(new_fd, buffer, MAXBUF, 0)) > 0) {
                    FILE *ClientFP = fdopen(new_fd, "w");
                    if (ClientFP == NULL) {
                        if (!daemon_y_n) {
                            prterrmsg("fdopen()");
                        } else {
                            prterrmsg("fdopen()");
                        }
                    } else {
                        char Req[MAXPATH + 1] = "";
                        sscanf(buffer, "GET %s HTTP", Req);
                        bzero(buffer, MAXBUF + 1);
                        sprintf(buffer, "请求取文件: \"%s\"\n", Req);
                        if (!daemon_y_n) {
                            prtinfomsg(buffer);
                        } else {
                            wrtinfomsg(buffer);
                        }
                        /* 处理用户请求 */
                        GiveResponse(ClientFP, Req);
                        fclose(ClientFP);
                    }
                }
                exit(0);
            }
            close(new_fd);
        }
        close(sock_fd);
        return 0;
    }
Exemple #2
0
int main(int argc, char **argv)
{
	struct sockaddr_in addr;
	int sock_fd, addrlen;
	
	getoption(argc, argv);

	if (!host) {
		addrlen = strlen(DEFAULTIP);
		AllocateMemory(&host, addrlen, DEFAULTIP);
	}
	if (!port) {
		addrlen = strlen(DEFAULTPORT);
		AllocateMemory(&port, addrlen, DEFAULTPORT);
	}
	if (!back) {
		addrlen = strlen(DEFAULTBACK);
		AllocateMemory(&back, addrlen, DEFAULTBACK);
	}
	if (!dirroot) {
		addrlen = strlen(DEFAULTDIR);
		AllocateMemory(&dirroot, addrlen, DEFAULTDIR);
	}
	if (!logdir) {
		addrlen = strlen(DEFAULTLOG);
		AllocateMemory(&logdir, addrlen, DEFAULTLOG);
	}

	printf
		("host=%s port=%s back=%s dirroot=%s logdir=%s %s daemon mode (pID:%d)\n",
		 host, port, back, dirroot, logdir, daemon_y_n?"":"is not", getpid());

	/* fork() twice for daemon  */
	if (daemon_y_n) {
		if (fork())
		  exit(0);
		if (fork())
		  exit(0);
		close(0), close(1), close(2);
		logfp = fopen(logdir, "a+");
		if (!logfp)
		  exit(0);
	}

	signal(SIGCHLD, SIG_IGN);

	if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		if (!daemon_y_n) {
			prterrmsg("socket()");
		} else {
			wrterrmsg("socket()");
		}
	}

	addrlen = 1;
	setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &addrlen,
				sizeof(addrlen));

	addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(port));
	addr.sin_addr.s_addr = inet_addr(host);
	addrlen = sizeof(struct sockaddr_in);
	
	if (bind(sock_fd, (struct sockaddr *) &addr, addrlen) < 0) {
		if (!daemon_y_n) {
			prterrmsg("bind()");
		} else {
			wrterrmsg("bind()");
		}
	}

	if (listen(sock_fd, atoi(back)) < 0) {
		if (!daemon_y_n) {
			prterrmsg("listen()");
		} else {
			wrterrmsg("listen()");
		}
	}
	while (1) {
		int len;
		int new_fd;
		addrlen = sizeof(struct sockaddr_in);
		
		new_fd = accept(sock_fd, (struct sockaddr *) &addr, &addrlen);
		if (new_fd < 0) {
			if (!daemon_y_n) {
				prterrmsg("accept()");
			} else {
				wrterrmsg("accept()");
			}
			break;
		}
		bzero(buffer, MAXBUF + 1);
		sprintf(buffer, "connection from : %s:%d\n",
					inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
		if (!daemon_y_n) {
			prtinfomsg(buffer);
		} else {
			wrtinfomsg(buffer);
		}
		
		if (!fork()) {
			bzero(buffer, MAXBUF + 1);
			if ((len = recv(new_fd, buffer, MAXBUF, 0)) > 0) {
				FILE *ClientFP = fdopen(new_fd, "w");
				if (ClientFP == NULL) {
					if (!daemon_y_n) {
						prterrmsg("fdopen()");
					} else {
						prterrmsg("fdopen()");
					}
				} else {
					char Req[MAXPATH + 1] = "";
					sscanf(buffer, "GET %s HTTP", Req);
					bzero(buffer, MAXBUF + 1);
					sprintf(buffer, "request file : \"%s\"\n", Req);
					if (!daemon_y_n) {
						prtinfomsg(buffer);
					} else {
						wrtinfomsg(buffer);
					}
					
					GiveResponse(ClientFP, Req);
					fclose(ClientFP);
				}
			}
			exit(0);
		}
		close(new_fd);
	}
	close(sock_fd);
	return 0;
}