Advertisement
Guest User

reader page site

a guest
Jun 1st, 2014
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. //(c)Terminator
  2. #include <iostream>
  3. #include <cstring>
  4. #include <winsock2.h>
  5. using namespace std;
  6. #pragma comment(lib, "ws2_32.lib")
  7.  
  8.  
  9. // чтение всей URL-страницы
  10. int  read_url(const char* url, std::string& dst, DWORD msec = 25000) {
  11.     const int MAX_BUFSIZE = 4096;
  12.  
  13.     int    ret, err;
  14.     DWORD  len, flags;
  15.     char*  pbuf;
  16.     SOCKET        sock;
  17.     WSABUF        ibuf;
  18.     HOSTENT*      host;
  19.     WSAEVENT      ievent;
  20.     SOCKADDR_IN   addr;
  21.     WSAOVERLAPPED iover;
  22.  
  23.     if(strnicmp(url, "http://", 6) != 0)
  24.         return -1;
  25.  
  26.     char  buf[128], *ptr = &buf[0];
  27.     for(const char* p = &url[7]; *p && (*p != '/'); )
  28.         *ptr++ = *p++;
  29.     *ptr = '\0';
  30.  
  31.     if((ievent = WSACreateEvent()) == WSA_INVALID_EVENT)
  32.         return WSAGetLastError();
  33.  
  34.     pbuf = (char*)HeapAlloc(GetProcessHeap(), 0, MAX_BUFSIZE * sizeof(char));
  35.     if(pbuf == NULL){
  36.         err = WSAGetLastError();
  37.         WSACloseEvent(ievent);
  38.         return err;
  39.     }
  40.  
  41.     // создаём сокет
  42.     sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
  43.     if(sock == INVALID_SOCKET){
  44.         err = WSAGetLastError();
  45.         HeapFree(GetProcessHeap(), 0, (LPVOID)pbuf);
  46.         WSACloseEvent(ievent);
  47.         return err;
  48.     }
  49.    
  50.     memset(&addr, 0, sizeof(SOCKADDR_IN));
  51.     addr.sin_family = AF_INET;
  52.     addr.sin_port   = htons(80);
  53.     if((host = gethostbyname(buf)) == NULL){
  54.         err = WSAGetLastError();
  55.         goto error;
  56.     }
  57.     memcpy(&addr.sin_addr, host->h_addr_list[0], host->h_length);
  58.  
  59.  
  60.     // коннектимся к серверу
  61.     ret = WSAConnect(sock, (const sockaddr*)&addr, sizeof(addr), NULL, NULL, NULL, NULL);
  62.     if(ret == SOCKET_ERROR){
  63.         err = WSAGetLastError();
  64.         goto error;
  65.     }
  66.    
  67.     //задаём GET-запрос
  68.     dst = "GET ";
  69.     dst.append(url);
  70.     dst.append(" \r\nhost: ");
  71.     dst.append(buf);
  72.     dst.append("\r\n\r\n");
  73.  
  74.     ibuf.buf = &dst[0];
  75.     ibuf.len = (int)dst.length();
  76.  
  77.     //посылаем запрос
  78.     ret = WSASend(sock, &ibuf, 1, &len, 0, NULL, NULL);
  79.     if(ret == SOCKET_ERROR){
  80.         err = WSAGetLastError();
  81.         dst = "";
  82.         goto error;
  83.     }
  84.  
  85.     // цикл чтения данных
  86.     dst = "";
  87.     do {
  88.         memset(&iover, 0, sizeof(WSAOVERLAPPED));
  89.         iover.hEvent = ievent;
  90.         ibuf.buf     = pbuf;
  91.         ibuf.len     = MAX_BUFSIZE - 1;
  92.         WSAResetEvent(ievent);
  93.  
  94.         flags = len = 0;
  95.         ret   = WSARecv(sock, &ibuf, 1, &len, &flags, (LPWSAOVERLAPPED)&iover, NULL);
  96.         if((ret == SOCKET_ERROR) && ((err = WSAGetLastError()) != WSA_IO_PENDING))
  97.             goto error;
  98.  
  99.         // ожидание для принятие данных с сервера
  100.         if(WSAWaitForMultipleEvents(1, &ievent, FALSE, msec, FALSE) != WSA_WAIT_EVENT_0){
  101.             err = WSAGetLastError();
  102.             goto error;
  103.         }
  104.  
  105.         if(! WSAGetOverlappedResult(sock, &iover, &len, FALSE, &flags))
  106.             break;
  107.  
  108.         if(len > 0)
  109.             dst.append(pbuf, pbuf + len);
  110.         else
  111.             break;
  112.  
  113.     } while(1);
  114.  
  115.     err = ERROR_SUCCESS;
  116. error:
  117.     closesocket(sock);
  118.     WSACloseEvent(ievent);
  119.     HeapFree(GetProcessHeap(), 0, (LPVOID)pbuf);
  120.     return err;
  121. }
  122.  
  123.  
  124. int main(void){
  125.     WSADATA  data = {0};
  126.     if(WSAStartup(MAKEWORD(2, 2), &data) != 0)
  127.         return 1;
  128.  
  129.     char url[] = "http://www.mysite.ru/index.php";
  130.  
  131.     std::string ds;
  132.     int err = read_url(url, ds);
  133.     if(err == ERROR_SUCCESS)//если ошибок нет, выводим в консоль текст
  134.         cout << ds.c_str() << endl;
  135.     else
  136.         cout << "error, code: " << err << endl;
  137.  
  138.     WSACleanup();
  139.     cin.get();
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement