|
|
ru.nethack- RU.NETHACK ------------------------------------------------------------------- From : Alexey V. Vissarionov 2:5020/545 25 Jan 2004 01:39:58 To : Leonid Zaprudsky Subject : пpокси? -------------------------------------------------------------------------------- 24 Jan 04 20:44:28 Leonid Zaprudsky -> All: LZ> есть два компа в локальной сети: один из них с очень-очень огpаниченными LZ> pесypсами(но вин 95 стоит), интеpнета на нем нет, на втоpом - есть LZ> интеpнет, чеpез некий внешний вингейт. LZ> Задача: запyстить на втоpом некyю пpогpаммy, пpи pаботе котоpой было бы LZ> возможно выходить в интеpнет с пеpвой, пpосто yказав в эксплоpеpе адpес LZ> пpокси. LZ> Какая пpогpамма спpавится с этим? Что-нибудь наподобие этого: ==== хрум bounce.c ==== #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/resource.h> #include <fcntl.h> #include <errno.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <signal.h> #include <sys/wait.h> #define QLEN 5 #define DEFAULT_PORT 1523 char sbuf[16384], cbuf[16384]; extern int errno; void sigchld() { signal(SIGCHLD, sigchld); while (waitpid(0, (int *) 0, WNOHANG | WUNTRACED) >= 0); } void communicate(int sfd, int cfd) { char *chead, *ctail, *shead, *stail; int num, nfd, spos, cpos; extern int errno; fd_set rd, wr; struct itimerval itime; itime.it_interval.tv_sec = 0; itime.it_interval.tv_usec = 0; itime.it_value.tv_sec = 21600; itime.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &itime, NULL); chead = ctail = cbuf; cpos = 0; shead = stail = sbuf; spos = 0; while (1) { FD_ZERO(&rd); FD_ZERO(&wr); if (spos < sizeof(sbuf) - 1) FD_SET(sfd, &rd); if (ctail > chead) FD_SET(sfd, &wr); if (cpos < sizeof(cbuf) - 1) FD_SET(cfd, &rd); if (stail > shead) FD_SET(cfd, &wr); nfd = select(256, &rd, &wr, 0, 0); if (nfd <= 0) continue; if (FD_ISSET(sfd, &rd)) { num = read(sfd, stail, sizeof(sbuf) - spos); if ((num == -1) && (errno != EWOULDBLOCK)) return; if (num == 0) { if (ctail != chead) write(sfd, chead, ctail - chead); if (stail != shead) write(cfd, shead, stail - shead); write(cfd, chead, 0); return; } if (num > 0) { spos += num; stail += num; if (!--nfd) continue; } } if (FD_ISSET(cfd, &rd)) { num = read(cfd, ctail, sizeof(cbuf) - cpos); if ((num == -1) && (errno != EWOULDBLOCK)) return; if (num == 0) { if (ctail != chead) write(sfd, chead, ctail - chead); if (stail != shead) write(cfd, shead, stail - shead); write(sfd, chead, 0); return; } if (num > 0) { cpos += num; ctail += num; if (!--nfd) continue; } } if (FD_ISSET(sfd, &wr)) { num = write(sfd, chead, ctail - chead); if ((num == -1) && (errno != EWOULDBLOCK)) return; if (num > 0) { chead += num; if (chead == ctail) { chead = ctail = cbuf; cpos = 0; } if (!--nfd) continue; } } if (FD_ISSET(cfd, &wr)) { num = write(cfd, shead, stail - shead); if ((num == -1) && (errno != EWOULDBLOCK)) return; if (num > 0) { shead += num; if (shead == stail) { shead = stail = sbuf; spos = 0; } if (!--nfd) continue; } } } } int main(int argc, char **argv) { int srv_fd, rem_fd, len, cl_fd, on = 1; int myport = DEFAULT_PORT, remoteport; struct sockaddr_in rem_addr, srv_addr, cl_addr; char *myname; struct hostent *hp; myname = argv[0]; if (argc == 5) { if (!strcasecmp(argv[1], "-p")) { if ((myport = atoi(argv[2])) == 0) { fprintf(stderr, "Bad port number.\n"); exit(-1); } argv += 2; argc -= 2; } else { fprintf(stderr, "Use: %s [-p localport] machine port \n", myname); exit(-1); } } if (argc != 3) { fprintf(stderr, "Use: %s [-p localport] machine port \n", myname); exit(-1); } if ((remoteport = atoi(argv[2])) <= 0) { fprintf(stderr, "Bad remote port number.\n"); exit(-1); } memset((char *) &rem_addr, 0, sizeof(rem_addr)); memset((char *) &srv_addr, 0, sizeof(srv_addr)); memset((char *) &cl_addr, 0, sizeof(cl_addr)); cl_addr.sin_family = AF_INET; cl_addr.sin_port = htons(remoteport); if ((hp = gethostbyname(argv[1])) == NULL) { cl_addr.sin_addr.s_addr = inet_addr(argv[1]); if (cl_addr.sin_addr.s_addr == -1) { fprintf(stderr, "Unknown host.\n"); exit(-1); } } else cl_addr.sin_addr = *(struct in_addr *) (hp->h_addr_list[0]); srv_addr.sin_family = AF_INET; srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); srv_addr.sin_port = htons(myport); srv_fd = socket(PF_INET, SOCK_STREAM, 0); if (bind(srv_fd, &srv_addr, sizeof(srv_addr)) == -1) { perror("bind"); exit(-1); } listen(srv_fd, QLEN); signal(SIGCHLD, sigchld); printf("Ready to bounce connections from port %i to %s on port %i\n", myport, argv[1], remoteport); close(0); close(1); close(2); chdir("/"); if (fork()) exit(0); while (1) { len = sizeof(rem_addr); rem_fd = accept(srv_fd, &rem_addr, &len); if (rem_fd < 0) { if (errno == EINTR) continue; exit(-1); } switch (fork()) { case -1: /* we're in the background.. no-one to complain to */ break; case 0: /* child process */ close(rem_fd); break; default: /* parent process */ close(srv_fd); /* close original socket */ if ((cl_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { close(rem_fd); exit(-1); } if (connect(cl_fd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) { close(rem_fd); exit(-1); } setsockopt(cl_fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)); setsockopt(rem_fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)); communicate(cl_fd, rem_fd); close(rem_fd); exit(0); } } } ==== тьфу bounce.c ==== Как собрать это под форточками, можешь не спрашивать - я вот уже седьмой год оные наблюдаю на расстоянии не менее 2 метров. Alexey V. Vissarionov aka Gremlin from Kremlin (gremlin ПРИ gremlin ТЧК ru) [DRBL] [OWL] [SRT] ... Лучше пусть судят трое, чем несут четверо --- /bin/vi * Origin: http://openwall.com/Owl/ru/ (2:5020/545) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.nethack/22940012e994.html, оценка из 5, голосов 10
|