Вопрос следующий, при принятии любого хтмл документа через интернет мы в классе выделяем под него аж
#define MAX_PACKET_SIZE 500000
500 000 байт так как sizeof(char)=1
бессмысленно да? а есть ли ограничение по этому размеру?
вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать. Интересует исходник функции
HttpOpenRequest
HttpSendRequest
HttpReadFile
как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера.. и еще один дополнительный вопрос.
Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов? я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?
И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?
Здравствуйте, r1der, Вы писали:
R>вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать. Интересует исходник функции R>HttpOpenRequest R>HttpSendRequest R>HttpReadFile
Обратись в Микрософт, может , они тебе персонально выдадут исходники этих функций, да и всех остальных тоже
R>как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера..
MSDN почитай, на гугле поищи, да и здесь тоже. Примеров с этим функциями сколько угодно.
>и еще один дополнительный вопрос.
R> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов?
Не хочешь — не пользуйся
>я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?
Примерно так.
R> И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?
Да.
Тебе надо серьезно заняться свои образованием, и начать с более простых вещей, чем сокеты. Иначе ничего путного не напишешь.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, r1der, Вы писали:
R>>вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать. Интересует исходник функции R>>HttpOpenRequest R>>HttpSendRequest R>>HttpReadFile
PD>Обратись в Микрософт, может , они тебе персонально выдадут исходники этих функций, да и всех остальных тоже
R>>как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера..
PD>MSDN почитай, на гугле поищи, да и здесь тоже. Примеров с этим функциями сколько угодно.
примеры не нужны, просто интеерсно взглянуть как написано, естессно нигде не найти, но наверняка кто-то пытался сделать аналог. не надо так сразу скептически относитьсяк вопросам
>>и еще один дополнительный вопрос.
R>> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов?
PD>Не хочешь — не пользуйся
другого выхода не нашел..
>>я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?
PD>Примерно так.
R>> И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?
PD>Да.
PD>Тебе надо серьезно заняться свои образованием, и начать с более простых вещей, чем сокеты. Иначе ничего путного не напишешь.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, r1der, Вы писали:
R>>вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать. Интересует исходник функции R>>HttpOpenRequest R>>HttpSendRequest R>>HttpReadFile
PD>Обратись в Микрософт, может , они тебе персонально выдадут исходники этих функций, да и всех остальных тоже
R>>как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера..
PD>MSDN почитай, на гугле поищи, да и здесь тоже. Примеров с этим функциями сколько угодно.
>>и еще один дополнительный вопрос.
R>> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов?
PD>Не хочешь — не пользуйся
>>я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?
PD>Примерно так.
R>> И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?
PD>Да.
PD>Тебе надо серьезно заняться свои образованием, и начать с более простых вещей, чем сокеты. Иначе ничего путного не напишешь.
Здравствуйте, r1der, Вы писали:
R>>> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов?
PD>>Не хочешь — не пользуйся
R>другого выхода не нашел..
std::string.
А с сишными строками -- ничего не поделаешь, сплошная беготня указателей.
Здравствуйте, r1der, Вы писали:
R>примеры не нужны, просто интеерсно взглянуть как написано,
Извини за резкость — не валяй дурака. Или тебе неизвестно, что Windows не есть Open Source и исходники ее не дают ?
>естессно нигде не найти, но наверняка кто-то пытался сделать аналог
Чего аналог ? Кода с socket и recv ? Хоть пруд пруди. Использования Internet API — тоже.
Начни с любой приличной книги по С и С++. Под рукой ссылок сейчас нет, поищи здесь на форуме и на гугле. Страуструпа обязательно, а впрочем, начать с Кернигана-Ритчи тоже не помешает. Лучшего совета дать не могу, так как книг по С++ давно не читал
R> char * recv()
R> {
R> int len = 0,slen=0;
R> do
R> {
R> if (SOCKET_ERROR == (len = ::recv (s, (char *) &buffer, MAX_PACKET_SIZE, 0) ) )
R> cout<<WSAGetLastError ();
R> slen+=len;
R> }
R> while (len!=0);
R> cout<<slen<<endl;
R> buffer[slen]='\0';
R> return buffer;
R> }
R>
R>Вопрос следующий, при принятии любого хтмл документа через интернет мы в классе выделяем под него аж R>#define MAX_PACKET_SIZE 500000 R>500 000 байт так как sizeof(char)=1 R>бессмысленно да? а есть ли ограничение по этому размеру?
Да, бессмысленно. recv будет записывать те данные, которые накопились во внутреннем буфере (с момента предыдущего вызова recv), а он значительно меньше 500К. Это, кстати, требует постоянного прокручивания recv — а то можно получить невесть что, поскольку все поступившие данные в промежуточных буферах не уместились.
Кроме того:
— SOCKET_ERROR — это -1, т.е. ты инструкцией slen+=len вычитаешь единицу из slen;
— Если recv вернёт 0, то ты влетаешь в бесконечный цикл (см. MSDN — откуда может взяться 0 при выходе из recv);
— Инструкция buffer[slen]='\0' гарантирует undefined behavior в случае SOCKET_ERROR и что вернёт Vkontakte::recv — вопрос с очень расплывчатым ответом.
R>вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать.
Правильно сказали. Если нужна только обработка http-запросов, то лучше взять WinInet, чем сокеты.
R>Интересует исходник функции R>HttpOpenRequest R>HttpSendRequest R>HttpReadFile R>как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера.. и еще один дополнительный вопрос.
Да нету никакой проблемы с динамическим буфером: malloc/free или new[]/delete[]. Кроме того, непосредственно работу с сокетом, особенно если он работает на приём, имеет смысл выделять в поток с повышенным приоритетом.
R> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов? я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?
Да. Только strcat-ом совсем не обязательно пользоваться. Можно и даже, подчас, нужно пользоваться отдельным указателм, показывающим на хвост строки или переменной, где хранится длина.
R> И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?
Да. Тот факт, что сигнатура recv записана как int recv(SOCKET s, char* buf, int len, int flags); означает только то, что тип переменной buf — указатель на массив, с размером элемента в 1 байт ("массив символов"), больше никаких предположений о работе с ним не делается — по выходе из recv этот массив запросто может содержать пачку нулей ("\0\0\0\0").
P.S.: В общем, присоединяюсь к Дворкину. Тебе имеет смысл освоиться с программированием на C, да хоть MSDN внимательно почитать, а потом браться за работу с сокетами. Свои же нервы целее будут.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, r1der, Вы писали:
R>>> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов? PD>>Не хочешь — не пользуйся R>другого выхода не нашел..
И это симптоматично, кстати. Дело в том, что стандартная библиотека C предоставляет не "лучшие из возможных" и не "самые правильные" решения, а, скажем так, просто некие "стандартные". Пользоваться функциями CRTL (C RunTime Library) или нет — здесь однозначного ответа не бывает. В особенности, в части работы со строками.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
не факт что slen будет <= MAX_PACKET_SIZE в противном случае бабах
R> return buffer;
R> }
Дальше читать утомился.
R>Вопрос следующий, при принятии любого хтмл документа через интернет мы в классе выделяем под него аж R>#define MAX_PACKET_SIZE 500000 R>500 000 байт так как sizeof(char)=1
Серьёзно? Ты открыл нам глаза.
R>бессмысленно да? а есть ли ограничение по этому размеру?
только твоей фантазией и тех возможностями твоего железа
R>вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать.
Это твой шанс дружище
R> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов? я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?
ну твой опыт не есть обязателен для всех и вся
R> И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?
предлагаю написать жалобу в страсбургский суд
Не обижайся. Но в самом деле почитай книжек для начала.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>И это симптоматично, кстати. Дело в том, что стандартная библиотека C предоставляет не "лучшие из возможных" и не "самые правильные" решения, а, скажем так, просто некие "стандартные". Пользоваться функциями CRTL (C RunTime Library) или нет — здесь однозначного ответа не бывает. В особенности, в части работы со строками.
Что я никогда понять не мог — зачем strcpy возвращает свой первый аргумент. Он же мне и так известен. Вернули бы указатель на '\0' в dest — и не надо никакой strcat
Здравствуйте, r1der, Вы писали:
R>Есть код..
R>Вопрос следующий, при принятии любого хтмл документа через интернет мы в классе выделяем под него аж R>#define MAX_PACKET_SIZE 500000 R>500 000 байт так как sizeof(char)=1 R>бессмысленно да? а есть ли ограничение по этому размеру?
Ограничения есть. Если ты работаешь под Windows в среде Visual C++.NET 2005-2008? то:
1. если твой объект будет объявлен локально в функции, то ограничением служит размер стека. Насколько я знаю (а более знающие могут меня поправить), размер стека ограничен 1 мегабайтом.
2. Если твой объект объявлен глобально, то размер ограничен 2 гигабайтами (виртуальной памяти, естественно).
3. Если твой объект создается динамически, то размер динамического объекта ограничен 2 гигабайтами.
R> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов? я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?
Пользуйся классом string стандартной библиотеки.
А вообще-то почитай сначала книжки по С++. А то впечатление, что совсем неграмотный чел пишет.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Что я никогда понять не мог — зачем strcpy возвращает свой первый аргумент. Он же мне и так известен. Вернули бы указатель на '\0' в dest — и не надо никакой strcat
Скорее всего, из общих соображений, что результат strcat — это результат конкатенации, т.е. — вся строка.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Что я никогда понять не мог — зачем strcpy возвращает свой первый аргумент. Он же мне и так известен. Вернули бы указатель на '\0' в dest — и не надо никакой strcat
Что-то я слишком задумался. В соседнем сообщении написал про strcat, хотя речь шла про strcpy. Ну, здесь, я думаю, то же самое, что и с strcat — результат копирования это тот самый dest, соответственно и возвращает strcpy то, что должна возвращать "по высшим соображениям", а не ради оптимизации.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Скорее всего, из общих соображений, что результат strcat — это результат конкатенации, т.е. — вся строка.
Здравствуйте, LaptevVV, Вы писали:
LVV>1. если твой объект будет объявлен локально в функции, то ограничением служит размер стека. Насколько я знаю (а более знающие могут меня поправить), размер стека ограничен 1 мегабайтом.
Здравствуйте, r1der, Вы писали:
R>Интересует исходник функции R>HttpOpenRequest R>HttpSendRequest R>HttpReadFile R>как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера..
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Pavel Dvorkin, Вы писали:
ГВ>>Скорее всего, из общих соображений, что результат strcat — это результат конкатенации, т.е. — вся строка. PD>Или из такого соображения
PD>strcat(strcpy(szBuf,"тра-ля"),"-ля");
PD>
Угу. По форме аналогично: s = (szBuf = "тра-ля") + "-ля".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!