Re[4]: Не помещаются данные, массивы..
От: r1der Россия  
Дата: 09.10.09 12:18
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, r1der, Вы писали:



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


PD>Начни с любой приличной книги по С и С++. Под рукой ссылок сейчас нет, поищи здесь на форуме и на гугле. Страуструпа обязательно, а впрочем, начать с Кернигана-Ритчи тоже не помешает. Лучшего совета дать не могу, так как книг по С++ давно не читал


я читал либерти, и энциклопедию и за 21 день. страуструпа само собой. пользуюсь как справочником.. лафоре.. стивен прата С++ черная такая очень хорошая.. шмидта архив программ, искусство программирования.. фундаментальные алгоритмы.. этого недостаточно ? в чем проявилось мое незнание? в что что я попросил "исходники" винды.. я попросил просто походую чью нибудь опенсорсную реализацию..
icq 314624
Re[2]: Не помещаются данные, массивы..
От: r1der Россия  
Дата: 09.10.09 12:22
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, 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 внимательно почитать, а потом браться за работу с сокетами. Свои же нервы целее будут.



да вы правы, почитаю.. не могли вы показать на примере моего кривого кода как надо все это было сделать? заранее большое спасибо
icq 314624
Re[5]: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 12:51
Оценка: 30 (4)
Здравствуйте, r1der, Вы писали:

R>я читал либерти, и энциклопедию и за 21 день. страуструпа само собой. пользуюсь как справочником.. лафоре.. стивен прата С++ черная такая очень хорошая.. шмидта архив программ, искусство программирования.. фундаментальные алгоритмы.. этого недостаточно ? в чем проявилось мое незнание? в что что я попросил "исходники" винды..


Нет. Это лишь характеризует насколько ты ориентирован в этой области, и только.

Проблема не в этом, а в том, что ты демонстрируешь незнание основ языка. Проще говоря, ты не сделал все необходимые при его изучении упражнения и не набил себе все положенные шишки. И поэтому всем виден твой уровень — чтобы его продемонстрировать, порой достаточно один ляп сделать, что тебе удается вполне успешно.

А это не C# и не Бейсик, тут за ошибки бьют очень больно, причем порой экзекуцию откладывают надолго. Иными словами, тебе может казаться, что все работает как надо, в то время как там куча ошибок, и ты о них узнаешь только, когда уже отдашь программу заказчику.

Поэтому мой тебе совет — оставь в покое сокеты и попытки загрузить страницы. Это для тебя слишком сложно. Начни с простых примеров по программированию, хотя бы с задачника в Керниган-Ритчи. Потом классы, и всерьез, там далеко не все просто и не все логично. А потом и сам будешь знать, как делать.

Говорю это все как преподаватель с 20-летним стажем. В программировании на С++ нет легких дорог. Здесь нельзя работать по принципу — мне надо вот это, спрошу, как это сделать, сделаю, и т.д. Ничего так не сделаешь.
With best regards
Pavel Dvorkin
Re[4]: Не помещаются данные, массивы..
От: Pavel Dvorkin Россия  
Дата: 09.10.09 12:53
Оценка: :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, 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 * ));
ГВ>


ГВ>



Но если в опциях проекта поставить, то и сюда оно попадет при 0 значении stack_size здесь. Хотя это, м.б. и не надо. Да здравствует наследование
With best regards
Pavel Dvorkin
Re[5]: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 12:54
Оценка: +1
Здравствуйте, r1der, Вы писали:

R>я читал либерти, и энциклопедию и за 21 день. страуструпа само собой. пользуюсь как справочником.. лафоре.. стивен прата С++ черная такая очень хорошая.. шмидта архив программ, искусство программирования.. фундаментальные алгоритмы.. этого недостаточно ? в чем проявилось мое незнание? в что что я попросил "исходники" винды.. я попросил просто походую чью нибудь опенсорсную реализацию..


По ходу дела ты сделал кучу наивных ошибок не только в коде, но и в предположениях о работе широко известных функций. Это не плохо само по себе, кто из нас не ошибался, просто такие ошибки свидетельствуют о том, что ты ещё путаешься в основах того, что, наверное, можно назвать "культурой программирования на C". Например, мне чрезвычайно трудно представить мало-мальски опытного человека, который бы предполагал, что recv должна класть нуль в конец принятых данных.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 13:07
Оценка:
Здравствуйте, r1der, Вы писали:

ГВ>>P.S.: В общем, присоединяюсь к Дворкину. Тебе имеет смысл освоиться с программированием на C, да хоть MSDN внимательно почитать, а потом браться за работу с сокетами. Свои же нервы целее будут.


R>да вы правы, почитаю.. не могли вы показать на примере моего кривого кода как надо все это было сделать? заранее большое спасибо


Знаешь, давай, я на примере твоего кривого кода кроме ошибок ничего тебе показывать не буду. Сходи лучше по этим ссылкам: Программирование сети в VC++ и Протокол HTTP.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: Не помещаются данные, массивы..
От: r1der Россия  
Дата: 09.10.09 13:14
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, r1der, Вы писали:


R>>я читал либерти, и энциклопедию и за 21 день. страуструпа само собой. пользуюсь как справочником.. лафоре.. стивен прата С++ черная такая очень хорошая.. шмидта архив программ, искусство программирования.. фундаментальные алгоритмы.. этого недостаточно ? в чем проявилось мое незнание? в что что я попросил "исходники" винды.. я попросил просто походую чью нибудь опенсорсную реализацию..


ГВ>По ходу дела ты сделал кучу наивных ошибок не только в коде, но и в предположениях о работе широко известных функций. Это не плохо само по себе, кто из нас не ошибался, просто такие ошибки свидетельствуют о том, что ты ещё путаешься в основах того, что, наверное, можно назвать "культурой программирования на C". Например, мне чрезвычайно трудно представить мало-мальски опытного человека, который бы предполагал, что recv должна класть нуль в конец принятых данных.


да я с вами полностью согласен.. ушел читать книги) программирую всего то месяц может быть, но просто тут встала задача написать вот такую штуку которую пытался. так что не судите строго)
icq 314624
Re[4]: Не помещаются данные, массивы..
От: r1der Россия  
Дата: 09.10.09 13:15
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, r1der, Вы писали:


ГВ>>>P.S.: В общем, присоединяюсь к Дворкину. Тебе имеет смысл освоиться с программированием на C, да хоть MSDN внимательно почитать, а потом браться за работу с сокетами. Свои же нервы целее будут.


R>>да вы правы, почитаю.. не могли вы показать на примере моего кривого кода как надо все это было сделать? заранее большое спасибо


ГВ>Знаешь, давай, я на примере твоего кривого кода кроме ошибок ничего тебе показывать не буду. Сходи лучше по этим ссылкам: Программирование сети в VC++ и Протокол HTTP.


ок спс..
icq 314624
Re[7]: Не помещаются данные, массивы..
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.10.09 13:19
Оценка:
Здравствуйте, r1der, Вы писали:

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


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