socket 使用代理下载源代码

  1. #include <winsock2.h>
  2. #include <windows.h>
  3. #include <iostream>
  4. #include <stdio.h>
  5. using namespace std;
  6. char szServer[MAX_PATH] = "10.218.12.174";//"10.218.14.115";
  7. int nPort = 808;
  8. int main()
  9. {
  10.     SOCKET  sock    = NULL;
  11.     char    szBuf[MAX_PATH]     = {0};
  12.     
  13.     WSADATA wsaData = {0};
  14.     sockaddr_in sin = {0};
  15.     int     nLen = 0;
  16.     FILE*   fp = NULL;
  17.     if (0 != ::WSAStartup(0x0202, &wsaData))
  18.     {
  19.         cout << "init socket failed! err code = " << ::WSAGetLastError() << endl;
  20.         return 0;
  21.     }
  22.     //创建socket
  23.     if (INVALID_SOCKET == (sock = ::socket(AF_INET, SOCK_STREAM, 0)) )
  24.     {
  25.         cout << "创建socket失败! err code = " << ::WSAGetLastError() << endl;
  26.         return 0;
  27.     }
  28.     sin.sin_family = AF_INET;
  29.     sin.sin_port = ::htons(nPort);
  30.     sin.sin_addr.S_un.S_addr = ::inet_addr(szServer);
  31.     if (INADDR_NONE == sin.sin_addr.S_un.S_addr)
  32.     {
  33.         LPHOSTENT   pHost   = NULL;
  34.         pHost = ::gethostbyname(szServer);
  35.         if (NULL != pHost)
  36.         {
  37.             ::CopyMemory(&sin.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length);
  38.         }
  39.         else
  40.         {
  41.             cout << "域名解析失败!" << endl;
  42.             return 0;
  43.         }
  44.     }
  45.     if (SOCKET_ERROR == ::connect(sock, (sockaddr*)&sin, sizeof(sin)) )
  46.     {
  47.         cout << "connect failed! err code = " << ::WSAGetLastError() << endl;
  48.         return 0;
  49.     }
  50.     // 发送CONNCET请求令到代理服务器,用于和代理建立连接
  51.     //代理服务器的地址和端口放在m_ProxyAddr,m_Port 里面
  52.     sprintf(szBuf, "CONNECT %s:%d HTTP/1.1/r/nUser-Agent: MyApp/0.1/r/n/r/n", szServer, nPort);
  53.     
  54.     if (SOCKET_ERROR == ::send(sock, szBuf, strlen(szBuf), 0))
  55.     {
  56.         cout << "send message failed! err code = " << ::WSAGetLastError() << endl;
  57.         return 0;
  58.     }
  59.     ::recv(sock, szBuf, MAX_PATH, 0);
  60.     cout << "szBuf = " << szBuf << endl;
  61.     //下载文件
  62.     if (strstr(szBuf, "200") >= 0)
  63.     {   
  64.         sprintf(szBuf, "GET http://blog.csdn.net/andylin02 HTTP/1.1/r/nHost:blog.csdn.net/r/nAccept: */*/r/n/r/n");
  65.     
  66.         if (SOCKET_ERROR == ::send(sock, szBuf, strlen(szBuf), 0))
  67.         {
  68.             cout << "send message failed! err code = " << ::WSAGetLastError() << endl;
  69.             return 0;
  70.         }
  71.         fp = ::fopen("./save.txt""w");
  72.         if (NULL == fp)
  73.         {
  74.             cout << "打开文件失败!" << endl;
  75.             return 0;
  76.         }
  77.         while (TRUE)
  78.         {
  79.             ::memset(szBuf, 0, MAX_PATH);
  80.             nLen = ::recv(sock, szBuf, MAX_PATH - 1, 0);
  81.             if (nLen == 0)
  82.             {
  83.                 cout << "save success!" << endl;
  84.                 break;
  85.             }
  86.             ::fwrite(szBuf, nLen, 1, fp);
  87.             ::fflush(fp);
  88.         }
  89.     }
  90.     if (sock)
  91.     {
  92.         ::closesocket(sock);
  93.         sock = NULL;
  94.     }
  95.     ::WSACleanup();
  96.     return 0;
  97. }
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值