详解 Android 中的微型云
2010-02-22 16:05:00 来源:WEB开发网tiny clound 的 main(parent)功能在清单 10 中定义。它分配了将在其上侦听浏览器请求调用的 TCP/IP 套接字。随后它将初始化一些全局变量,比如 theDir,微型云将在这些全局变量中启动。最终,它将自身创建为一个驻留程序(也称为 daemon),这样就可以在运行其他进程的同时在后台安静地处理浏览器请求。
清单 10. Main 函数
int main(int argc, char **argv) { char* str; char* cret; static struct sockaddr_in cli_addr; static struct sockaddr_in serv_addr; socklen_t length; int i; int port; int pid; int listenfd; int socketfd; int hit; cret=getcwd(logDir, LBUF); if(argc < 2) { strcpy((char*) thePort, "80"); port=atoi((char*) thePort); } else { if(!strcmp(argv[1], "-?")) { printf("Usage: cloud [Port Directory] "); exit(0); } strcpy((char*) thePort, argv[1]); port=atoi((char*) thePort); if(port < 0 || port > 60000) aclog(ERROR, "Invalid port number (try 1 --> 60000)", argv[1], 0); if(chdir(argv[2]) == -1) { printf("ERROR: Invalid directory %s ", argv[2]); exit(4); } } if(fork != 0) return 0; signal(SIGCHLD, SIG_IGN); signal(SIGHUP, SIG_IGN); for(i=0; i<32; i++) close(i); setpgrp; aclog(LOG, "Cloud Port/PID=", (char*) thePort, getpid); if((listenfd=socket(AF_INET, SOCK_STREAM, 0)) < 0) aclog(ERROR, "syscall", "socket", 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(port); if(bind(listenfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) aclog(ERROR, "syscall", "bind", 0); if(listen(listenfd, 64) <0) aclog(ERROR, "syscall", "listen", 0); for(hit=1; ;hit++) { length=sizeof(cli_addr); if((socketfd=accept(listenfd, (struct sockaddr*) &cli_addr, (socklen_t*) &length)) < 0) aclog(ERROR, "syscall", "accept", 0); if((pid=fork) < 0) { aclog(ERROR, "syscall", "fork", 0); } else { if(pid == 0) { close(listenfd); child(socketfd, hit); } else { close(socketfd); } } } }
编译、部署和测试应用程序
您需要另外创建一个文件来使用 kernel 内核源 makefile 文件恰当地编译这个云应用程序。创建一个名为 Android.mk
更多精彩
赞助商链接