首页 网络安全 安全学院 查看内容

sock5代理客户端例子

2009-8-28 10:58 928 0

摘要: //simple web browser, use specified SOCKS5 proxy to make request  #include <winsock2.h> #...
关键词: nbsp request addr server sockfd proxy connect return char error

//simple web browser, use specified SOCKS5 proxy to make request  #include <winsock2.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h>  #define PORT 80 #define HTTP_REQUEST_FORMAT "GET %s HTTP/1.0\n\n"  int main(int argc, char **argv) {  WSADATA wsaData;  int sockfd, bufsiz, t, i;  struct sockaddr_in addr;  struct hostent *he;  char http_request[1040];  char server[256];  char page[1024];  char proxy_addr[256];  char rdata[256];  int proxy_port;  char SOCKS5_REQUEST_INIT[] = {5, 1, 0}; //version 5, no auth  char server_response_1[2];  char socks_connect_request[512];  int destname_ip;  char *ch = socks_connect_request;  char c;  if (argc != 5) {   puts("viewer dest page proxy proxy_port");   return 0;  }  sscanf(argv[1], "%255s", server);  sscanf(argv[2], "%1023s", page);  sscanf(argv[3], "%255s", proxy_addr);  sscanf(argv[4], "%d", &proxy_port);  if (WSAStartup(0x202, &wsaData) == -1) {//init winsock   puts("Fatal error: WSAStartup failed.");   return 1;  }  sockfd = WSASocket(AF_INET, SOCK_STREAM, 0, 0, 0, 0);  if (sockfd == -1) {   puts("Fatal error: socket failed.");   return 1;  }  ((struct in_addr*) &addr)->s_addr = inet_addr(proxy_addr);  if (((struct in_addr*) &addr)->s_addr != INADDR_NONE) {   if ((he = gethostbyaddr((char*) &addr, 4, AF_INET)) == 0) {    puts("Fatal error: gethostbyaddr failed.");    return 1;   }  }  else {   if ((he = gethostbyname(proxy_addr)) == 0) {    puts("Fatal error: gethostbyname failed.");    return 1;   }  }  addr.sin_family = AF_INET;  addr.sin_port = htons(proxy_port);  addr.sin_addr = *((struct in_addr *) he->h_addr);  if (connect(sockfd, (struct sockaddr*) &addr, 16) == -1) {   puts("Fatal error: connect to proxy failed.");   return 1;  }  //now connected to proxy server  if (send(sockfd, SOCKS5_REQUEST_INIT, sizeof(SOCKS5_REQUEST_INIT), 0) == -1) {   puts("FATAL ERROR: COULD NOT SEND REQUEST TO PROXY");   return 1;  }  if (recv(sockfd, server_response_1, sizeof(server_response_1), 0) == -1) {   puts("FATAL ERROR: PROXY NOT RESPOND");   return 1;  }  if (server_response_1[1]) {   printf("Error: proxy required authentication %x\n", server_response_1[1]);   return 1;  }  socks_connect_request[0] = 5; //SOCKS version 5  socks_connect_request[1] = 1; //TCP/IP connect  socks_connect_request[2] = 0;  if (inet_addr(server) == INADDR_NONE) //check if user specified ip or hostname for dest server   destname_ip = 0;  else   destname_ip = 1;  socks_connect_request[3] = (destname_ip ? 1 : 3); //ip or hostname  ch += 4;  if (destname_ip) {   *((DWORD *) ch) = inet_addr(server);   ch += 4;  }  else {   int i = strlen(server);   *ch = (char) i;   strcpy(ch + 1, server); //copy hostname   ch += i + 1;  }  *((short *) ch) = htons(PORT); //remote server port  if (send(sockfd, socks_connect_request, (int) (ch + 2 - socks_connect_request), 0) == -1) { //send connect request   printf("%d\n", WSAGetLastError());   puts("FATAL ERROR: CANNOT SEND REQUEST TO PROXY");   return 1;  }  recv(sockfd, rdata, 4, 0); //read server response  if (rdata[1] != 0) {   printf("ERROR: SOCKS5 ERROR CODE %x\n", rdata[1]);   return 1;  }  if (rdata[3] == 1) {   recv(sockfd, rdata, 4, 0);  }  else {   recv(sockfd, &c, 1, 0);   recv(sockfd, rdata, c, 0);  }  recv(sockfd, rdata, 2, 0);  sprintf(http_request, HTTP_REQUEST_FORMAT, page); //build valid HTTP request  send(sockfd, http_request, strlen(http_request), 0);  while (1) {   char ch;   int t = recv(sockfd, &ch, 1, 0);   if (t == -1) { //recv error    puts("\nERROR: recv failed");    break;   }   if (t == 0) //graceful disconnection    break;   putchar(ch);  }  closesocket(sockfd);  WSACleanup();  return 0; }
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部