Форум программистов, компьютерный форум CyberForum.ru

Не пойму где ошибка - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:10     Не пойму где ошибка #1
Всем привет, вот решил написать простенький класс для работы с интернетом и выскакивают какие-то ошибки, не пойму в чем дело, вот эти ошибки:

Run-Time Check Failure #3 - The variable 'szData' is being used without being initialized.
Первый этап обработки исключения в "0x77c370f2" в "tfbti_lib_AP.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Необработанное исключение в "0x77c370f2" в "tfbti_lib_AP.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Программа "[11620] tfbti_lib_AP.exe: Машинный код" завершилась с кодом 0 (0x0).


Вот код. В этом файле только прототипы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// tfbti_motor.h - Содержит в себе класс с прототипами методов
// tfbti - The future behind the Internet - Будущее за интернетом
// Заточен под Windows XP.
#include <Windows.h>
#include <WinInet.h>
 
namespace CPPtfbti_class {
 
    // - КОНСТАНТЫ ДЛЯ РАБОТЫ С БИБЛИОТЕКОЙ
    const INTERNET_PORT IDHP = INTERNET_DEFAULT_HTTP_PORT;
    const DWORD ISH = INTERNET_SERVICE_HTTP;
    const DWORD IOTP = INTERNET_OPEN_TYPE_PRECONFIG;
    const DWORD IFKC = INTERNET_FLAG_KEEP_CONNECTION;
 
    class WIAP {
    public:
        WIAP(LPCSTR pNameBot = "AP_bot", int i = 0);
        ~WIAP();
    // Сами функции
 
    // - Есть ли подключение к интернету?
    bool is_Inet();
 
    // - Открывает библиотеку
    void Open_Internet(DWORD D = IOTP, LPCSTR N = NULL, LPCSTR N2 = NULL, DWORD flag = 0);
 
    // - Открывает соединение с интернетом
    void Open_Connection(
            
        LPCSTR site = "www.yandex.ru",
        INTERNET_PORT constant = IDHP, 
        LPCSTR N = NULL, 
        LPCSTR N2 = NULL, 
        DWORD serv = ISH, 
        DWORD i = 0, 
        DWORD i2 = 1);
 
    // - Выводит все прочитанные сайты
    void my_Sites();
 
    // - Строит запрос для входа на сайт
    void Build_Query(
 
        LPCSTR method = "GET", 
        LPCSTR path = "/",
        LPCSTR N = NULL, 
        LPCSTR N2 = NULL, 
        LPCSTR* i = 0, 
        DWORD ip = IFKC, 
        DWORD i2 = 0);
 
    // - Отправляет запрос
    bool Send_Query(LPCSTR N = NULL, DWORD i = 0, LPVOID N2 = NULL, DWORD i2 = 0);
 
    // - Читает страницу
    bool Read_File(char* szData, DWORD size, DWORD *dwBytes);
 
    // - Закрывает указанный дескриптор
    void close(HINTERNET desc);
 
 
 
    protected:
 
    int status;
    LPCSTR name_Bot;
    HINTERNET hOpen, hConnect, hRequest;
 
    };
}
Вот их реализации.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// release.cpp
#include <iostream>
#include <fstream>
#include "tfbti_motor.h"
#pragma comment(lib, "wininet.lib")
using namespace std;
 
namespace CPPtfbti_class {
    // Конструктор
    WIAP::WIAP(LPCSTR pNameBot, int i) : status(i), name_Bot(pNameBot) {}
    // Деструктор
    WIAP::~WIAP() {}
 
    // - Есть ли подключение к интернету?
    bool WIAP::is_Inet() {
        if(InternetAttemptConnect(0) != ERROR_SUCCESS)
            return false;
        return true;
    }
 
    // - Открывает библиотеку
    void WIAP::Open_Internet(DWORD D, LPCSTR N, LPCSTR N2, DWORD flag) {
        hOpen = InternetOpen(name_Bot, D, N, N2, flag);
    }
 
    // - Открывает соединение с интернетом
    void WIAP::Open_Connection(LPCSTR site, INTERNET_PORT constant, LPCSTR N, LPCSTR N2, DWORD serv, DWORD i, DWORD i2) {
        hConnect = InternetConnect(hOpen, site, constant, N, N2, serv, i, i2);
    }
 
    // - Строит запрос для входа на сайт
    void WIAP::Build_Query(LPCSTR method, LPCSTR path, LPCSTR N, LPCSTR N2, LPCSTR* i, DWORD ip, DWORD i2) {
        hRequest = HttpOpenRequest(hConnect, method, path, N, N2, i, ip, i2);
    }
 
    // - Отправляет запрос
    bool WIAP::Send_Query(LPCSTR N, DWORD i, LPVOID N2, DWORD i2) {
        return HttpSendRequest(hRequest, N, i, N2, i2);
    }
 
    // - Читает страницу
    bool WIAP::Read_File(char* szData, DWORD size, DWORD *dwBytes) {
        if(InternetReadFile(hRequest, szData, size, dwBytes)) {
            if(status) {
                ofstream file("newStr.html");
                file << *szData;
                cout << *szData;
                return true;
            }
            cout << *szData;
            return true;
        }
        return false;
    }
}
Вот как я их вызываю.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include "tfbti_motor.h"
using namespace CPPtfbti_class;
using namespace std;
 
int main() {
    setlocale(0, "Russian");
    cout << "Привет" << endl;
 
    WIAP inet("Andrew Bot");
    if(inet.is_Inet()) {
    inet.Open_Internet();
    inet.Open_Connection("www.google.ru");
    inet.Build_Query();
    inet.Send_Query();
    char* szData;
    DWORD bytes;
    inet.Read_File(szData, sizeof(szData)-1, &bytes);
 
    }
    else {
        cout << "Нет интернета";
    }
 
 
    system("pause >> void");
    return 0;
}
Подскажите пожалуйста, в чем проблема?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:36  [ТС]     Не пойму где ошибка #21
Цитата Сообщение от ValeryS Посмотреть сообщение
кстати на чем пишешь
На VC++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
06.04.2011, 22:37     Не пойму где ошибка #22
буффер то добавил а при чтении в файл заменил на sizeof(char)*4096?

C++
1
inet.Read_File(szData, 4096, &bytes);
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:41  [ТС]     Не пойму где ошибка #23
точно =))))

Добавлено через 2 минуты
увеличил на 1000000 и там и там, при чтении читает пол страницы, а остальное НННННННН
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.04.2011, 22:43     Не пойму где ошибка #24
Цитата Сообщение от DeadRipper Посмотреть сообщение
inet.Read_File(szData, sizeof(char)*1024, &bytes);
чтобы не забывать вызывай так
C++
1
inet.Read_File(szData, sizeof (szData)/sizeof(char), &bytes);
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
06.04.2011, 22:45     Не пойму где ошибка #25
C++
1
sizeof (szData)/sizeof(char)
если бы массив был определен статически то да,
но ведь у него szData по прежнему указатель

тогда уж лучше так))

C++
1
2
3
4
#define BUF_SIZE ....
 
char* szData = new char[BUF_SIZE]
inet.Read_File(szData, BUF_SIZE/sizeof(char), &bytes);
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.04.2011, 22:46     Не пойму где ошибка #26
пардон увлекся
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:47  [ТС]     Не пойму где ошибка #27
читает максимум 2621 символов, включая ННННН, они всегда есть, что это такое?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.04.2011, 22:48     Не пойму где ошибка #28
тогда надо объявить макрос или константу размер буфера
иначе таких косяков будет
если в 5 местах использовать запомни все где править
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
06.04.2011, 22:49     Не пойму где ошибка #29
а может быть на 2621 байте файл и кончается?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
тогда надо объявить макрос или константу размер буфера
иначе таких косяков будет
если в 5 местах использовать запомни все где править
ага, от структурирования кода многое зависит
потом знай только меняй константу и все)

ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.04.2011, 22:58     Не пойму где ошибка #30
погугли насчет InternetReadFile
я вот сечас нашел
В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?
Просто если сервер никак не размечает отправляемые "блоки", то у клиента нет никакой возможности их разделить. На долгом пути от сервера эти "блоки" в принципе могут многократно разбиваться на более мелкие и опять склеиваться, причём "разделение" между блоками будет выглядеть просто как некоторая произвольная задержка между группами пакетов транспортного уровня, весьма условное разделение. Всё что можно сделать, это вычитывать из соединения данные блоками фиксированного размера, либо с помощью связки InternetQueryDataAvailable + InternetReadFileEx читать то, что доступно в данный момент. Но ни то, ни другое не гарантирует, что разделение на "блоки", сделанное на сервере, сохранится на клиенте.
и вот что предлагают
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
PVOID pReadBuffer;
int   iBlockSize;      // Сюда будет писаться размер блока
bool  fData = false;
DWORD dwReaded, 
      dwBufferSize = sizeof(int);
pReadBuffer = &iBlockSize;
 
BOOL fNoReadError = TRUE;
while (fNoReadError = InternetReadFile(hRequest, pReadBuffer, dwBufferSize, &dwReaded)) // !! must be = (not ==)
{
   if (dwReaded)
   {
      if (fData)
      {
         ProcessData(pReadBuffer);  // Обрабатываете свой блок
         free(pReadBuffer);
         // Готовимся читать новый блок
         fData = false;
         pReadBuffer  = &iBlockSize;
         dwBufferSize = sizeof(int);
      } else
      {
         pReadBuffer  = malloc(iBlockSize);
         dwBufferSize = iBlockSize;
         fData = true;
      }
   } else
     break;   // все считано
}
...
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 23:05  [ТС]     Не пойму где ошибка #31
то есть в цикле желательно обрабатывать?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.04.2011, 23:22     Не пойму где ошибка #32
Цитата Сообщение от DeadRipper Посмотреть сообщение
BUF_SIZE/sizeof(char)
Это лишнее просто BUF_SIZE
Цитата Сообщение от BTR Посмотреть сообщение
то есть в цикле желательно обрабатывать?
я так понял да
интернет програмированием не увлекался

Добавлено через 14 минут
еще
Поскольку InternetReadFile создает в кеше файл с прочитанными же данными (в папке кеша IE), то можно посмотреть там: реально ли все получил?
BTR
 Аватар для BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 23:28  [ТС]     Не пойму где ошибка #33
ну я три года программировал на PHP. Интернет программирование нравится, потом понял что программирование интернетом не заканчивается, взялся на С++, за более мощное средство. И учить его мне намного к сожалению сложней чем ПЫХ. Но дорогу преодолеет идущий.

Добавлено через 1 минуту
К тому же на сколько я знаю, крупные проекты, такие как фейсбук, яндекс пишутся на С++. Фейсбук кстати поначалу на пыхе был написан, но с его ростом переписали на С++. Что же, буду продолжать учить плюсы, всем большое спасибо! Удачи Вам
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2011, 23:29     Не пойму где ошибка
Еще ссылки по теме:

Не пойму где ошибка C++
C++ STL stack, не пойму где ошибка
C++ Не пойму, где ошибка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
06.04.2011, 23:29     Не пойму где ошибка #34
еще
Нашел!!!

Для того, чтобы скачать файл, сначала используется функция InternetOpen, после чего нужно вызвать InternetOpenUrl, третим параметром нужно задать тип запроса: "Accept: */*".
Вот когда я поменял значение параметра LPCTSTR lpszHeaders с NULL на указанный, все заработало!
ну и статейка
http://rsdn.ru/article/inet/inetapi.xml
Yandex
Объявления
06.04.2011, 23:29     Не пойму где ошибка
Ответ Создать тему
Опции темы

Текущее время: 12:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru