int _tmain(int argc, _TCHAR* argv[]) { WSADATA ws; WSAStartup(MAKEWORD(2, 2), &ws);; struct proxy *prox; prox = proxy_create(); assert(prox); proxy_set(prox, "192.168.79.1", 1080, "test", "0"); proxy_connect(prox, "113.108.16.44", 25); proxy_recv_line(prox, buff, 512); return 0; }
int proxy_connect(int sockfd, struct sockaddr *serv_addr, int addrlen ) { struct sockaddr_in name; int ret; switch (proxy_type) { case PROXY_NONE: /* normal use */ return (connect(sockfd,serv_addr,addrlen)); break; case PROXY_HTTP: /* Http proxy */ /* do the tunneling */ /* step one : connect to proxy */ { struct hostent *hostinfo; unsigned short shortport = proxy_port; memset (&name, 0, sizeof (name)); name.sin_family = AF_INET; name.sin_port = htons (shortport); hostinfo = gethostbyname (proxy_host); if (hostinfo == NULL) { fprintf (stderr, "Unknown host %s.\n", proxy_host); return (-1); } name.sin_addr = *(struct in_addr *) hostinfo->h_addr; } toc_debug_printf("Trying to connect ...\n"); if ((ret = connect(sockfd,(struct sockaddr *)&name,sizeof(name)))<0) return(ret); /* step two : do proxy tunneling init */ { char cmd[80]; char *inputline; unsigned short realport=ntohs(((struct sockaddr_in *)serv_addr)->sin_port); sprintf(cmd,"CONNECT %s:%d HTTP/1.1\n\r\n\r",proxy_realhost,realport); toc_debug_printf("<%s>\n",cmd); if (send(sockfd,cmd,strlen(cmd),0)<0) return(-1); if (proxy_recv_line(sockfd,&inputline) < 0) { return(-1); } toc_debug_printf("<%s>\n",inputline); if (memcmp("HTTP/1.0 200 Connection established",inputline,35)) if (memcmp("HTTP/1.1 200 Connection established",inputline,35)) { free(inputline); return(-1); } while (strlen(inputline)>1) { free(inputline); if (proxy_recv_line(sockfd,&inputline) < 0) { return(-1); } toc_debug_printf("<%s>\n",inputline); } free(inputline); } return ret; break; case PROXY_SOCKS: fprintf(stderr,"Socks proxy is not yet implemented.\n"); return(-1); break; default: fprintf(stderr,"Unknown proxy type : %d.\n",proxy_type); break; } return(-1); }