/* get IP address and create socket */ void get_ip(GtkWidget *button,gpointer ip_text) { gchar *serv_ip; int res; serv_ip=(gchar *)gtk_entry_get_text(GTK_ENTRY((GtkWidget *)ip_text)); res=build_socket(serv_ip); if(res==1) show_err("IP Address is Invalid...\n"); else if(res==-1) show_err("Connect Failure... \n");/*插入文本到缓冲区*/ else{ show_err("Connect Successful... \n"); issucceed=0; } }
void accept_client(int fin, int fout) { char addr_str[20]; int fd, clientaddrlen, res; struct sockaddr_in clientaddr; fd = build_socket(); clientaddrlen = sizeof(struct sockaddr_in); while (1) { res = accept(fd, (struct sockaddr*)&clientaddr, &clientaddrlen); if (res == -1) { perror("accept error"); } write(fout, &clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr)); } }
int wanduck_main(int argc, char **argv){ char *http_servport, *dns_servport; socklen_t clilen; struct sockaddr_in cliaddr; struct timeval tval; int nready, maxi, sockfd, conn_state; #ifdef RTCONFIG_USB_MODEM int modem_ready_count = MODEM_IDLE; #endif /*int pid; // daemonize if((pid = fork()) != 0) exit(0); umask(0); setsid(); chdir("/"); close(STDIN_FILENO); //close(STDOUT_FILENO); //close(STDERR_FILENO); struct stat fstatus; int fd; int max_tbl_sz = getdtablesize(); for(fd = (STDERR_FILENO+1); fd <= max_tbl_sz; ++fd){ if(fstat(fd, &fstatus) == 0){ fprintf(stdout, "The inherited fd(%d) is closed.\n", fd); close(fd); } }//*/ signal(SIGHUP, SIG_IGN); signal(SIGTERM, safe_leave); signal(SIGUSR1, get_related_nvram2); // 2010.09 James. signal(SIGUSR2, rebuild_rule); // 2010.09 James. if(argc < 3){ http_servport = DFL_HTTP_SERV_PORT; dns_servport = DFL_DNS_SERV_PORT; } else{ // 2007.10 James { if(atoi(argv[1]) <= 0) http_servport = DFL_HTTP_SERV_PORT; else http_servport = argv[1]; if(atoi(argv[2]) <= 0) dns_servport = DFL_DNS_SERV_PORT; else dns_servport = argv[2]; // 2007.10 James } } // 2007.10 James { if(build_socket(http_servport, dns_servport, &http_sock, &dns_sock) < 0){ csprintf("\n*** Fail to build socket! ***\n"); exit(0); } FILE *fp = fopen("/var/run/wanduck.pid", "w"); if(fp != NULL){ fprintf(fp, "%d", getpid()); fclose(fp); } // 2007.10 James } maxfd = (http_sock > dns_sock)?http_sock:dns_sock; maxi = -1; FD_ZERO(&allset); FD_SET(http_sock, &allset); FD_SET(dns_sock, &allset); for(fd_i = 0; fd_i < MAX_USER; ++fd_i){ client[fd_i].sfd = -1; client[fd_i].type = 0; } rule_setup = 0; disconn_case = 0; clilen = sizeof(cliaddr); sleep(3); // 2008.03 James. { if(nvram_match("x_Setting", "1")) isFirstUse = FALSE; else isFirstUse = TRUE; get_related_nvram(); if(!strcmp(nvram_safe_get("wan_ready"), "1")){ wan_ready = 1; get_related_nvram2(); } // 2008.03 James. } err_state = if_wan_phyconnected(); record_conn_status(); // 2008.02 James. if(err_state == DISCONN){ if(nat_enable == 1 || (fer < HAD_SET)){ csprintf("\n# Enable direct rule\n"); rule_setup = 1; _eval(add_command, NULL, 0, NULL); change_redirect_rules(2, 0); } } else if(err_state == CONNED && isFirstUse){ if((nat_enable == 1) || (fer < HAD_SET)){ csprintf("\n#CONNED : Enable direct rule\n"); rule_setup = 1; _eval(add_command, NULL, 0, NULL); change_redirect_rules(2, 0); } } for(;;){ rset = allset; tval.tv_sec = SCAN_INTERVAL; tval.tv_usec = 0; // 2008.03 James. { if(nvram_match("x_Setting", "1")) isFirstUse = FALSE; else isFirstUse = TRUE; if(wan_ready == 0 && !strcmp(nvram_safe_get("wan_ready"), "1")){ wan_ready = 1; get_related_nvram2(); if(isFirstUse == TRUE) // 0608 add { csprintf("\n# Rebuild rules\n"); _eval(add_command, NULL, 0, NULL); change_redirect_rules(1, 0); } } // 2008.03 James. } if((nat_enable == 1) || (fer < HAD_SET)){ conn_state = if_wan_phyconnected(); if(conn_state == CONNED){ if(err_state == DISCONN) err_state = D2C; else err_state = CONNED; #ifdef RTCONFIG_USB_MODEM modem_ready_count = MODEM_IDLE; #endif } else if(conn_state == DISCONN){ if(err_state == CONNED) err_state = C2D; else err_state = DISCONN; #ifdef RTCONFIG_USB_MODEM if(disconn_case == CASE_THESAMESUBNET) modem_ready_count = MODEM_IDLE; else if(!strcmp(nvram_safe_get("manually_disconnect_wan"), "1")) modem_ready_count = MODEM_IDLE; else if(!link_modem) modem_ready_count = MODEM_IDLE; else if(modem_ready_count == MODEM_IDLE) modem_ready_count = MODEM_READY; #endif } #ifdef RTCONFIG_USB_MODEM if(modem_ready_count != MODEM_IDLE){ if(modem_ready_count < MAX_WAIT_COUNT){ ++modem_ready_count; csprintf("# wanduck: wait time for switching: %d/%d.\n", modem_ready_count*SCAN_INTERVAL, MAX_WAIT_TIME_OF_MODEM); } else{ modem_ready_count = MODEM_READY; } } #endif record_conn_status(); // 2008.02 James. if(err_state == C2D || (err_state == CONNED && isFirstUse)){ if(rule_setup == 0){ // 2007.10 James csprintf("\n# Enable direct rule(C2D)\n"); rule_setup = 1; _eval(add_command, NULL, 0, NULL); change_redirect_rules(2, 1); update_wan(0); #ifdef RTCONFIG_USB_MODEM if(err_state == C2D && !link_modem && modem_running){ // plug-off the Modem. csprintf("\n# wanduck(C2D): Try to Switch the WAN line.(link_modem=%d).\n", link_modem); switch_usb_modem(link_modem); } #endif } } else if(err_state == D2C || err_state == CONNED){ if(rule_setup == 1 && !isFirstUse){ csprintf("\n#w Disable direct rule(D2C)\n"); rule_setup = 0; if(sw_mode == 2 ) system("iptables-restore /tmp/fake_nat_rules"); else { _eval(del_command, NULL, 0, NULL); } change_redirect_rules(2, 0); update_wan(1); } } #ifdef RTCONFIG_USB_MODEM // After boot, wait the WAN port to connect. else if(err_state == DISCONN){ if((link_modem && modem_ready_count >= MAX_WAIT_COUNT) || (!link_modem && modem_running) ) { if(modem_running) csprintf("# Switching the connect to WAN port...\n"); else csprintf("# Switching the connect to USB Modem...\n"); switch_usb_modem(!modem_running); } } #endif } else{ // ap mode nat_enable = 0; if(rule_setup == 1){ csprintf("\n#AP Disable direct rule(D2C)\n"); rule_setup = 0; if(sw_mode == 2 ) system("iptables-restore /tmp/fake_nat_rules"); else { _eval(del_command, NULL, 0, NULL); } change_redirect_rules(2, 0); update_wan(1); } } if((nready = select(maxfd+1, &rset, NULL, NULL, &tval)) <= 0) continue; if(FD_ISSET(dns_sock, &rset)){ //printf("# run fake dns service\n"); // tmp test run_dns_serv(dns_sock); if(--nready <= 0) continue; } else if(FD_ISSET(http_sock, &rset)){ //printf("# run fake httpd service\n"); // tmp test if((connfd = accept(http_sock, (struct sockaddr *)&cliaddr, &clilen)) <= 0){ perror("http accept"); continue; } cur_sockfd = connfd; for(fd_i = 0; fd_i < MAX_USER; ++fd_i){ if(client[fd_i].sfd < 0){ client[fd_i].sfd = cur_sockfd; client[fd_i].type = T_HTTP; break; } } if(fd_i == MAX_USER){ csprintf("wanduck servs full\n"); close(cur_sockfd); continue; } FD_SET(cur_sockfd, &allset); if(cur_sockfd > maxfd) maxfd = cur_sockfd; if(fd_i > maxi) maxi = fd_i; if(--nready <= 0) continue; // no more readable descriptors } // polling for(fd_i = 0; fd_i <= maxi; ++fd_i){ if((sockfd = client[fd_i].sfd) < 0) continue; if(FD_ISSET(sockfd, &rset)){ // 2007.10 James { int nread; ioctl(sockfd, FIONREAD, &nread); if(nread == 0){ close_socket(sockfd, T_HTTP); continue; } // 2007.10 James } cur_sockfd = sockfd; run_http_serv(sockfd); if(--nready <= 0) break; } } } csprintf("wanduck exit error\n"); exit(1); }
/* --------------UDP_Socket -------------*/ UDP_csocket::UDP_csocket(){ build_socket(UDP); DestAddr.sin_family = AF_INET; }
/* -------------TCP_Socket ------------ */ TCP_csocket::TCP_csocket(){ build_socket(TCP); }