Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //(c)Terminator
- #include <iostream>
- #include <cstring>
- #include <winsock2.h>
- using namespace std;
- #pragma comment(lib, "ws2_32.lib")
- // чтение всей URL-страницы
- int read_url(const char* url, std::string& dst, DWORD msec = 25000) {
- const int MAX_BUFSIZE = 4096;
- int ret, err;
- DWORD len, flags;
- char* pbuf;
- SOCKET sock;
- WSABUF ibuf;
- HOSTENT* host;
- WSAEVENT ievent;
- SOCKADDR_IN addr;
- WSAOVERLAPPED iover;
- if(strnicmp(url, "http://", 6) != 0)
- return -1;
- char buf[128], *ptr = &buf[0];
- for(const char* p = &url[7]; *p && (*p != '/'); )
- *ptr++ = *p++;
- *ptr = '\0';
- if((ievent = WSACreateEvent()) == WSA_INVALID_EVENT)
- return WSAGetLastError();
- pbuf = (char*)HeapAlloc(GetProcessHeap(), 0, MAX_BUFSIZE * sizeof(char));
- if(pbuf == NULL){
- err = WSAGetLastError();
- WSACloseEvent(ievent);
- return err;
- }
- // создаём сокет
- sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
- if(sock == INVALID_SOCKET){
- err = WSAGetLastError();
- HeapFree(GetProcessHeap(), 0, (LPVOID)pbuf);
- WSACloseEvent(ievent);
- return err;
- }
- memset(&addr, 0, sizeof(SOCKADDR_IN));
- addr.sin_family = AF_INET;
- addr.sin_port = htons(80);
- if((host = gethostbyname(buf)) == NULL){
- err = WSAGetLastError();
- goto error;
- }
- memcpy(&addr.sin_addr, host->h_addr_list[0], host->h_length);
- // коннектимся к серверу
- ret = WSAConnect(sock, (const sockaddr*)&addr, sizeof(addr), NULL, NULL, NULL, NULL);
- if(ret == SOCKET_ERROR){
- err = WSAGetLastError();
- goto error;
- }
- //задаём GET-запрос
- dst = "GET ";
- dst.append(url);
- dst.append(" \r\nhost: ");
- dst.append(buf);
- dst.append("\r\n\r\n");
- ibuf.buf = &dst[0];
- ibuf.len = (int)dst.length();
- //посылаем запрос
- ret = WSASend(sock, &ibuf, 1, &len, 0, NULL, NULL);
- if(ret == SOCKET_ERROR){
- err = WSAGetLastError();
- dst = "";
- goto error;
- }
- // цикл чтения данных
- dst = "";
- do {
- memset(&iover, 0, sizeof(WSAOVERLAPPED));
- iover.hEvent = ievent;
- ibuf.buf = pbuf;
- ibuf.len = MAX_BUFSIZE - 1;
- WSAResetEvent(ievent);
- flags = len = 0;
- ret = WSARecv(sock, &ibuf, 1, &len, &flags, (LPWSAOVERLAPPED)&iover, NULL);
- if((ret == SOCKET_ERROR) && ((err = WSAGetLastError()) != WSA_IO_PENDING))
- goto error;
- // ожидание для принятие данных с сервера
- if(WSAWaitForMultipleEvents(1, &ievent, FALSE, msec, FALSE) != WSA_WAIT_EVENT_0){
- err = WSAGetLastError();
- goto error;
- }
- if(! WSAGetOverlappedResult(sock, &iover, &len, FALSE, &flags))
- break;
- if(len > 0)
- dst.append(pbuf, pbuf + len);
- else
- break;
- } while(1);
- err = ERROR_SUCCESS;
- error:
- closesocket(sock);
- WSACloseEvent(ievent);
- HeapFree(GetProcessHeap(), 0, (LPVOID)pbuf);
- return err;
- }
- int main(void){
- WSADATA data = {0};
- if(WSAStartup(MAKEWORD(2, 2), &data) != 0)
- return 1;
- char url[] = "http://www.mysite.ru/index.php";
- std::string ds;
- int err = read_url(url, ds);
- if(err == ERROR_SUCCESS)//если ошибок нет, выводим в консоль текст
- cout << ds.c_str() << endl;
- else
- cout << "error, code: " << err << endl;
- WSACleanup();
- cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement