#include #include #include #include #include #include #include #include #include #include #define SSHHOST "ssh.example.com" #define SSHPORT 443 #define PROXYIP "172.16.1.1" #define PROXYPORT 8080 void *thread_run (void *arg) { fd_set rset; int nd = 0; FILE *fp; int i = 0; struct sockaddr_in sin; char rbuf[1024]; char sbuf[1024]; char *s; int ret; int maxfd; memset(&sin, 0, sizeof(sin)); if ((nd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(PROXYIP); sin.sin_port = htons(PROXYPORT); if ((connect(nd, (const struct sockaddr *)&sin, sizeof(sin))) < 0) { perror("connect"); exit(1); } sprintf(sbuf, "CONNECT %s:%d HTTP/1.0\r\n\r\n", SSHHOST, SSHPORT); send(nd, sbuf, strlen(sbuf), 0); ret = recv(nd, rbuf, 1024, 0); memset(rbuf, 0, 1024); ret = recv(nd, rbuf, 1024, 0); write(1, rbuf, ret); FD_ZERO(&rset); for ( ; ; ) { FD_SET(0, &rset); FD_SET(nd, &rset); maxfd = nd + 1; select(maxfd, &rset, NULL, NULL, NULL); if (FD_ISSET(0, &rset)) { ret = read(0, rbuf, 1024); if (ret > 0) send(nd, rbuf, ret, 0); else if (ret == 0) { close(0); close(nd); FD_CLR(0, &rset); exit(0); } } else if (FD_ISSET(nd, &rset)) { ret = recv(nd, rbuf, 1024, 0); if (ret > 0) write(1, rbuf, ret); else if (ret == 0) { close(nd); close(1); FD_CLR(nd, &rset); exit(1); } } } exit(0); } int main(int argc, char **argv) { int ld, *cd, len; pthread_t *tid; struct sockaddr_in sin, cin; thread_run(NULL); }