Не помещаются данные, массивы..
От: r1der Россия  
Дата: 08.10.09 20:39
Оценка: :))
Есть код..


#include <stdio.h>
#include "winsock2.h"
#include <iostream>
#include <fstream>
using namespace std;

#define MAX_PACKET_SIZE         500000


class Vkontakte
{
private:
   SOCKET s;
   sockaddr_in dest;
   char buffer[MAX_PACKET_SIZE];
   char req[1024];
   bool connected;
   
public:
    Vkontakte(char * server, int port)
    {
          ...
    }
    ~Vkontakte()
    {
    ...
    }
    int connect()
    {
    ...
    }
    int send(char * request)
    {
    ...
    }
    int send()
    {
        ...
    }
    char * recv()
    {
        int len = 0,slen=0;
         
        do
        {
            if (SOCKET_ERROR == (len = ::recv (s, (char *) &buffer, MAX_PACKET_SIZE, 0) ) )
                        cout<<WSAGetLastError ();
               slen+=len;

        }
        while (len!=0);
        cout<<slen<<endl;
        buffer[slen]='\0';
        return buffer;
    }
    //------ Gen Request
    void genmessage(char * server,int mt,char * path,char * useragent,char *);
};

void Vkontakte::genmessage(char * server,int mt,char * path,char * useragent,char * postdata=0)
{
    ...
}


int main()
{

    char  * useragent="Opera/9.64 (Windows NT 6.1; U; ru) Presto/2.1.1";
    

  Vkontakte check("forum.antichat.ru",80);
  check.connect();

  check.genmessage("forum.antichat.ru",1,"/",useragent,NULL);
  check.send();
  ofstream in("c:\\vks\\ok2.html");
  in<<check.recv();
  in.close();

    return 0;
}


Вопрос следующий, при принятии любого хтмл документа через интернет мы в классе выделяем под него аж
#define MAX_PACKET_SIZE 500000
500 000 байт так как sizeof(char)=1
бессмысленно да? а есть ли ограничение по этому размеру?
вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать. Интересует исходник функции
HttpOpenRequest
HttpSendRequest
HttpReadFile
как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера.. и еще один дополнительный вопрос.

Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов? я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?

И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?
icq 314624
Re: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 02:22
Оценка: +3
Здравствуйте, r1der, Вы писали:

R>вопрос такой. Недавно тут натолкнули на WinInet сказали мол это незапарно и не надо самому ничего писать. Интересует исходник функции

R>HttpOpenRequest
R>HttpSendRequest
R>HttpReadFile

Обратись в Микрософт, может , они тебе персонально выдадут исходники этих функций, да и всех остальных тоже


R>как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера..


MSDN почитай, на гугле поищи, да и здесь тоже. Примеров с этим функциями сколько угодно.


>и еще один дополнительный вопрос.


R> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов?


Не хочешь — не пользуйся

>я так понимаю она двигает указатель по исходной строке до тех пор пока не встретиться \0 далее вставляет данные и потом снова ставит \0?


Примерно так.

R> И еще последний вопрос) Когда функция recv пишет в буффер в данном случае char buffer[500000] почему она не ставит в конце нулевой символ? так и должно быть?


Да.

Тебе надо серьезно заняться свои образованием, и начать с более простых вещей, чем сокеты. Иначе ничего путного не напишешь.
With best regards
Pavel Dvorkin
Re[2]: Не помещаются данные, массивы..
От: r1der Россия  
Дата: 09.10.09 04:22
Оценка:
Здравствуйте, 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>Тебе надо серьезно заняться свои образованием, и начать с более простых вещей, чем сокеты. Иначе ничего путного не напишешь.
icq 314624
Re[2]: Не помещаются данные, массивы..
От: r1der Россия  
Дата: 09.10.09 04:28
Оценка:
Здравствуйте, 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>Тебе надо серьезно заняться свои образованием, и начать с более простых вещей, чем сокеты. Иначе ничего путного не напишешь.



может быть посоветуете пару полезных книг?
icq 314624
Re[3]: Не помещаются данные, массивы..
От: quodum  
Дата: 09.10.09 05:33
Оценка:
Здравствуйте, r1der, Вы писали:

R>>> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов?


PD>>Не хочешь — не пользуйся


R>другого выхода не нашел..


std::string.

А с сишными строками -- ничего не поделаешь, сплошная беготня указателей.
Re[3]: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 06:47
Оценка:
Здравствуйте, r1der, Вы писали:

R>примеры не нужны, просто интеерсно взглянуть как написано,


Извини за резкость — не валяй дурака. Или тебе неизвестно, что Windows не есть Open Source и исходники ее не дают ?

>естессно нигде не найти, но наверняка кто-то пытался сделать аналог


Чего аналог ? Кода с socket и recv ? Хоть пруд пруди. Использования Internet API — тоже.
With best regards
Pavel Dvorkin
Re[3]: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 06:51
Оценка: +1
Здравствуйте, r1der, Вы писали:


R>может быть посоветуете пару полезных книг?


Начни с любой приличной книги по С и С++. Под рукой ссылок сейчас нет, поищи здесь на форуме и на гугле. Страуструпа обязательно, а впрочем, начать с Кернигана-Ритчи тоже не помешает. Лучшего совета дать не могу, так как книг по С++ давно не читал
With best regards
Pavel Dvorkin
Re: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 07:11
Оценка:
Здравствуйте, r1der, Вы писали:

R>Есть код..


В котором много не правильно.

Начиная с разметки c#
R>
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.: Винодельческие провинции — это есть рулез!
Re[3]: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 07:23
Оценка: +1
Здравствуйте, r1der, Вы писали:

R>>> Почему всегда приходиться пользоваться функцией strcat чтобы добавить в конец строки какой то набор символов?

PD>>Не хочешь — не пользуйся
R>другого выхода не нашел..

И это симптоматично, кстати. Дело в том, что стандартная библиотека C предоставляет не "лучшие из возможных" и не "самые правильные" решения, а, скажем так, просто некие "стандартные". Пользоваться функциями CRTL (C RunTime Library) или нет — здесь однозначного ответа не бывает. В особенности, в части работы со строками.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Не помещаются данные, массивы..
От: abrec Россия  
Дата: 09.10.09 08:06
Оценка: -1
Здравствуйте, r1der, Вы писали:

R>Есть код..



в соответсвии с разметкой c# тебе в другую ветку
R>#include <stdio.h>
R>#include "winsock2.h"
R>#include <iostream>
R>#include <fstream>
R>using namespace std;

R>#define MAX_PACKET_SIZE         500000


R>class Vkontakte
R>{
R>private:
R>   SOCKET s;
R>   sockaddr_in dest;
R>   char buffer[MAX_PACKET_SIZE];
R>   char req[1024];
R>   bool connected;
   
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';

не факт что 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] почему она не ставит в конце нулевой символ? так и должно быть?


предлагаю написать жалобу в страсбургский суд

Не обижайся. Но в самом деле почитай книжек для начала.
Re[4]: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 08:37
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>И это симптоматично, кстати. Дело в том, что стандартная библиотека C предоставляет не "лучшие из возможных" и не "самые правильные" решения, а, скажем так, просто некие "стандартные". Пользоваться функциями CRTL (C RunTime Library) или нет — здесь однозначного ответа не бывает. В особенности, в части работы со строками.


Что я никогда понять не мог — зачем strcpy возвращает свой первый аргумент. Он же мне и так известен. Вернули бы указатель на '\0' в dest — и не надо никакой strcat
With best regards
Pavel Dvorkin
Re: Не помещаются данные, массивы..
От: LaptevVV Россия  
Дата: 09.10.09 08:49
Оценка:
Здравствуйте, 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 стандартной библиотеки.
А вообще-то почитай сначала книжки по С++. А то впечатление, что совсем неграмотный чел пишет.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 08:53
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Что я никогда понять не мог — зачем strcpy возвращает свой первый аргумент. Он же мне и так известен. Вернули бы указатель на '\0' в dest — и не надо никакой strcat


Скорее всего, из общих соображений, что результат strcat — это результат конкатенации, т.е. — вся строка.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: Тьфу ты... :)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 08:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Что я никогда понять не мог — зачем strcpy возвращает свой первый аргумент. Он же мне и так известен. Вернули бы указатель на '\0' в dest — и не надо никакой strcat


Что-то я слишком задумался. В соседнем сообщении написал про strcat, хотя речь шла про strcpy. Ну, здесь, я думаю, то же самое, что и с strcat — результат копирования это тот самый dest, соответственно и возвращает strcpy то, что должна возвращать "по высшим соображениям", а не ради оптимизации.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Не помещаются данные, массивы..
От: dcb-BanDos Россия  
Дата: 09.10.09 09:25
Оценка:
Здравствуйте, r1der, Вы писали:

R>Есть код..


гугли по curl, libcurl
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[6]: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 09:43
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Скорее всего, из общих соображений, что результат strcat — это результат конкатенации, т.е. — вся строка.


Или из такого соображения

strcat(strcpy(szBuf,"тра-ля"),"-ля");

With best regards
Pavel Dvorkin
Re[2]: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 09:57
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>1. если твой объект будет объявлен локально в функции, то ограничением служит размер стека. Насколько я знаю (а более знающие могут меня поправить), размер стека ограничен 1 мегабайтом.


Это только по умолчанию.

Project — Properties — Configuration Properties — Linker — System — Stack Reserve Size
Project — Properties — Configuration Properties — Linker — System — Stack Commit Size
With best regards
Pavel Dvorkin
Re: Не помещаются данные, массивы..
От: para  
Дата: 09.10.09 10:00
Оценка:
Здравствуйте, r1der, Вы писали:

R>Интересует исходник функции

R>HttpOpenRequest
R>HttpSendRequest
R>HttpReadFile
R>как они работают. Хотелось бы взглянуть на грамотную реализацию генератора запросов и как реализовывается решение моей проблемы с динамическим буфером для хранения ответа сервера..

Например http://pocoproject.org/docs/Poco.Net.HTTPRequest.html#13315 -это описание,
http://pocoproject.org/download/ — здесь исходники
Хорошая кросплатформенная библиотека на с++
Re[3]: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 10:55
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Это только по умолчанию.


PD>Project — Properties — Configuration Properties — Linker — System — Stack Reserve Size

PD>Project — Properties — Configuration Properties — Linker — System — Stack Commit Size

uintptr_t _beginthread(void *security, unsigned stack_size, unsigned ( *start_address )( void * ));


Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[7]: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 10:57
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

ГВ>>Скорее всего, из общих соображений, что результат strcat — это результат конкатенации, т.е. — вся строка.

PD>Или из такого соображения

PD>strcat(strcpy(szBuf,"тра-ля"),"-ля");


PD>


Угу. По форме аналогично: s = (szBuf = "тра-ля") + "-ля".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.