ria pc game
fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Сегодня
17 февраля 2019 21:31
Вход Регистрация Забыли пароль ?

megainformatic - Game craft - моделируем scv - шаг 2 (часть 3)
Game craft - моделируем scv - часть 3 [все уроки game craft]  [моделируем scv]  [моделируем scv шаг 1 часть 2] На рисунках показано как выдавить крылья правой руки, а затем выдавить 2 реактивных сопла в задней части. И наконец как выдавить резиновый трубопровод.
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - Создание сайта бесплатно или под заказ

megainformatic - Как создать flash баннер

megainformatic - Разработка flash-приложения для сайта: онлайн примерочная

megainformatic - Мои впечатления о книге - Владислав Крапивин - Журавленок и Молнии

megainformatic - Модуль отзывов/комментариев для вашего сайта

megainformatic - Модуль отзывов/комментариев для вашего сайта

megainformatic - Модуль отзывов/комментариев для вашего сайта

megainformatic - Модуль короткие ссылки short link

megainformatic - Работа с сокетами fsocket из php

megainformatic - Как создать игру Создание игровых панелей и индикаторов

megainformatic - Приключения Кости Коробкина - Как я провел лето - интерактивный комикс

megainformatic - Приключения Кости Коробкина - Как я провел лето - интерактивный комикс

megainformatic - Приключения Кости Коробкина - С новым годом - интерактивный комикс

megainformatic - Система управления сайтом на php - megainformatic cms admin files

megainformatic - обзор антивирусных средств защиты

megainformatic - как работает антивирус ?

megainformatic - Создание сайта для бизнеса

megainformatic - Новый взгляд на очевидные вещи

megainformatic - Разработка программ на c++

megainformatic - Немного о музыке

megainformatic - GET и POST запросы

megainformatic - для чего нужна карта сайта

megainformatic - Web Администрирование

megainformatic - Мысли о разном

megainformatic - Легко ли быть программистом

megainformatic - Глубины программирования на C++

megainformatic - Убираем лимит на размер импортируемого файла в PhpMyAdmin

megainformatic - Как создать torrent файл

megainformatic - Нужна ли валидация вашему сайту ?

megainformatic - Антивирус DrWeb

megainformatic - Калькулятор рассчёта стоимости зубопротезирования для стоматологической клиники

megainformatic - Что такое BitTorrent (БитТоррент)

megainformatic - Миссис Даутфайр 1993 фильм torrent

megainformatic - Как скачивать торрент-раздачу ?

megainformatic - Автотелега фильтр

megainformatic - Фильмы

megainformatic - Fahrengeit Фаренгейт игра 2006 для PC

megainformatic - Fez игра для PC 2013

megainformatic - Дневник памяти - фильм 2004

megainformatic - Scooter - The night - Video and Lyrics - Скутер - Ночь - Видео и лирика

megainformatic - Если всё же неудача

megainformatic - Смерть или искупление или избавление

megainformatic - По ту сторону

cj megainformatic - музыкальный альбом БЕСКОНЕЧНОЕ ДВИЖЕНИЕ ОЖИДАНИЕ И ДЕЙСТВИЕ

megainformatic - Костя Коробкин - Секретный проект - интерактивный комикс

megainformatic - Основы анимации во флеш на примере анимирования простейшей окружности

megainformatic - Парсер сайтов Введение

megainformatic - Я пишу музыку для себя и для продажи

megainformatic - Статьи на околомузыкальные темы - осень 2014 часть 1

megainformatic - рассказ - Чужие воспоминания - автор Синицин Андрей - 24.09.2014

megainformatic - Сайты живущие вне поисковых систем. Есть ли такие и как их найти ?

megainformatic - Game craft - проект разработки игровых и мультимедийных проектов

megainformatic - Game craft - моделируем scv

megainformatic - Game craft - моделируем scv - шаг 1 (часть 2)

megainformatic - Game craft - моделируем scv - шаг 2 (часть 3)

megainformatic - Game craft - Наложение текстуры на модель робота scv (часть 4)

подробнее

Для чего нужна карта сайта ?

Современный сайт - это достаточно сложная организационная структура. Поисковый робот - yandex, google или иной может быстрее проиндексировать сайт, если найдёт файл sitemap.xml

Это и есть та самая карта сайта

Файл sitemap.xml содержит ссылки на все страницы сайта, а также некоторую дополнительную информацию - по частоте обновлений этих страниц.

Поскольку современный сайт - это как правило набор из большого количества страниц, то имеет смысл поручить создание карты сайта программе.

В самом типовом случае cms должна иметь в наличии некий файл, обычно map.php, при обращении к которому происходит автоматический обход всех имеющихся страниц на сайте и генерация файла sitemap.xml

Целью данной статьи является описание алгоритма работы модуля map.php

После того, как Вы ознакомитесь с теорией и выполните ряд практических задач, Вы сможете создать модуль карты сайта практически для любой cms, т. е. универсальный.

Алгоритм работы модуля карта сайта.

Выполняет сбор информации обо всех индексируемых страницах сайта.

Индексируемая страница - это страница, которая является общедоступной для пользователей и поисковых роботов.

Скачаем megainformatic cms express files, откроем модуль map.php и посмотрим на его код.

Здесь я опущу код, который не относится непосредственно к алгоритму работы карты сайта.

$pageid = 1; //карта сайта начинается со страницы 1

$pagetitle = "сайт Мега Информатик - Новости"; //если страница не имеет своего заголовка - тогда будет использоваться этот

$pages_num = count($papers); //определяем количество страниц на сайте

for ( $pageid = 1; $pageid <= $pages_num; $pageid++ ) /* в массиве перебираем все страницы от 1 до последней */

{

$pagetitle = $papers[$pageid][1]; //получаем заголовок для выводимой страницы

//выводим страницу как ссылку на карте сайта

echo "<tr>
<td> </td>
<td><p><a href=\"index.php?page=".$pageid."\"><font size='2' face='Verdana, Arial, Helvetica,
sans-serif'>".$pagetitle."</font></a></p></td>
<td> </td>
</tr>
";

}

Описанный код формирует страничку карты сайта - как например тут - карта сайта

Единственный вопрос, который возникает - откуда берутся названия для заголовков страниц ?

Для этого служит переменная $papers

Она, как видим, хранит информацию о заголовках страниц, т. к. в строке кода

$pagetitle = $papers[$pageid][1]; //извлекается заголовок для страницы с номером $pageid

Откуда же в массиве $papers оказались эти данные ?

Нужно снова обратиться к коду модуля map.php, и внимательно посмотреть какие файлы подключаются -

config.php
header.php
и другие.

Поэтому появление переменной $papers нужно искать где-то в этих файлах.

Можно выполнить поиск по файлам, находящимся в папке куда вы распаковали архив megainformatic cms express files

После выполнения этой операции получим следующее -

modules/page.php -

Содержит в себе такую строку кода -

$papers = read_papers( $papers_filename, ';');

Это и есть ответ на поставленный вопрос.

На этом наш урок завершен.

Удачи вам в освоении технологий создания сайтов !

другие уроки на тему создания сайтов
подробнее

роман Eternity Вечность - автор Синицин Андрей megainformatic - страница 5

 

к странице 1 к странице 2 к странице 3 к странице 4 страница 5 к странице 6

 

* * *



Был найден более подходящий пример для решения задачи,
которая стояла передо мной.

c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple

Его мы и будем изучать далее.

А еще у меня в ходе работы возникла такая мысль:
всё что я делаю - это документирую свою деятельность в форме статей.

Если бы кому-то из непрограммисткой области пришло на ум задокументировать
какие-то свои действия и выложить на всеобщее обозрение, то
это выглядело бы по-меньшей мере странно. :)

Представьте, работник автосалона пишет:

Пришел на стэйшн, сделал то-то и то-то, чтобы раскрутить клиента
на покупку того или иного авто. И т.д.

Хотя идея, кстати говоря, не такая уж и странная.
Другие работники этой отрасли усвоив такие знания смогут
таким образом достичь каких-то результатов.

Правда в программировании результат всегда точно определен.
Это либо работающая программа делающая действия по решению
четко поставленной задачи, либо не делающая её.

Конечно с покупкой или не покупкой такой программы результат
более чем размыт.

Т. е. разработка программ и их продажа - это совершенно разные
отрасли деятельности, требующие и разных познаний, навыков
и инструментов (читай программ).

И если в программировании опять же всё более-менее ясно -
хотя бы с точки зрения получения результата на уровне: Да - получилось
или Нет - не получилось.

То в продажах царит нечто напоминающее (с моей конечно точки зрения)
"танцы с бубном".

Конечно же с точки зрения непосвященного деятельность программиста -
это точно такие же "магические заклинания" и "танцы с бубном".

Но и в той и другой отрасли результат легко оценить: если программа
работает - то она дает ответ на поставленные вопросы.

Если продукт продан и прибыль получена - то это тоже очевидно.

Другой вопрос, на тему которого мне бы тоже хотелось порассуждать, как это сейчас
модно во всяких ток-шоу, так это попытка расценивать деятельность
менеджеров и программистов на уровне того же самого программирования.

Но увы. В силу определенных причин такая оценка всегда крайне субъективна -
хоть, как говорится, результат и можно оценить как Да/Нет - 

но эти самые Да и Нет крайне размыты и зависят от личных качеств субъекта
который решает что оно Да или что оно Нет.

Если программа работает и дает успешный результат - это конечно Да.
Но никто не знает о её скрытых дефектах и возможности развивать программу
в будущем. Там существует целый комплекс вариантов: начиная от такого
когда в силу своих особенностей и опыта разработчика программу модифицировать
очень легко, до полной противоположности - когда легче написать новую программу,
чем разбираться во всех сложностях и тонкостях её реализации.


Обычно тот, кто считает себя квалифицированным видя перед собой какое-то
сложное решение, почти неглядя выбирает второй вариант.

Таким образом на первый план выходят не знания, а такая составляющая
как доверие к разработчику.

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

Если же такого нет - полагаются на случай.

И вот когда проект попадает в область, когда не совсем понятно кто виноват
в невозможности его завершения, тут всё завершается очень трагично.

Конечно может не совсем уж так трагично, но всё-таки и не совсем приятно.

В любом случае, один рабочий поток разработки завершается и начинается какой-то
совершенно другой. Но это уже совершенно другая история и она того, кто попал
под "каток" совершенно уже не интересует. А если и заинтересует, то только
с точки зрения "был ли я прав или нет ?". Под правотой понимается конечно уровень
квалификации, но всё можно списать на что угодно.

На нехватку финансирования, выделенного времени и т. д.

Одним словом люди с неудачным опытом совместного сотрудничества на уровне
"заказчик-исполнитель" просто расходятся в стороны и ищут каких-то новых вариантов.

Вот и всё.

Я конечно же всегда придерживаюсь мнения: на разработку нужно тратить столько времени,
сколько просит разработчик, а не ограничивать его.

Если будут какие-то ограничения - с финансовой стороны, либо со стороны временных рамок,
либо, что чаще и бывает - и с той и с другой стороны, да еще сдобренной хорошей порцией
сложностей в самом проекте и поставленных задачах, то если Ты только начинаешь работать
с таким проектом - впору задуматься: а стоит ли браться ?

Хуже бывает если выбора уже нет, и всё может окончиться отрицательным результатом и 
отрицательным опытом сотрудничества.

К сожалению или к счастью - программирование и разработка чего-либо, каких-либо программ и
изучение связанной с ними предметной отрасли, это деятельность которая сложно поддается
однозначной оценке. Оценки и результаты могут быть самые крайне противоположные от:
легко и дешево, до сложно и дорого со всеми возможными комбинациями вышеупомянутых и 
их различными варриациями представляющими смесь того и другого.

И всё зависит от:
квалификации разработчика,
способности адекватной оценки результата со стороны заказчика
и 
конечно же доступного бюджета и временных рамок.

В каких-то других, уже более-менее устоявшихся отраслях и сферах деятельности всё
уже более-менее устоялось и цены, время, опыт уже более-менее, но хорошо известны
и легче поддаются оценке.

Примеры ?

Да вот навскидку: услуги по перевозу грузов или пассажиров; оказание услуг в образовательной
сфере; концертная деятельность; розничная продажа товаров;

А в программировании ?

Заказчик порой может придумать что-то немыслимое. Не имея даже малейшего представления
как это реализовать и вообще возможно ли это. Он просто где-то что-то услышал-увидел-ему
подсказали.

И вперед.

Дальше начинается кино.

Под названием поиск исполнителя, который сможет за бросовый бюджет и короткий срок эту идею
поставить на ноги.

Если идея более-менее программно реализуемая - то конечно результат рано или поздно будет
получен.

Но чем сложнее идея, тем сложнее и тернистее путь заказчика, который решил, не своими руками,
всё это реализовать.

А почему не своими ? Не хватает знаний, опыта, времени. Но в то же время есть свободные
средства и чаще всего постановка задачи от какого-то начальства свыше.

Тогда и начинается новое кино.

Вера в то, что всё будет хорошо, даже если всё плохо, спасает нас. Это надежда на лучшее
и на то, что всё меняется к лучшему.

Модель её использования очень проста: зачем ругаться и мучать друг друга, когда можно всё
решить мирно и спокойно ?

Если задача решается - проявляем к этому минимум восторгов, если НЕ решается - минимум
досады и разочарования. И никаких поспешных выводов и решений. Иначе всё дело можно
загубить на корню.

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

Искреннее и доброжелательное отношение - вот ответ на любые вопросы и любые проблемы,
которые будут решаться в этом случае как бы сами собой.

Почему так ?

Да потому что всегда тот кто хочет найти, находит. А тот кто напротив, изначально дал
себе установку на отрицательный результат - его и получит в итоге.

Не будьте врагами сами себе !

Тот кто привык что-то ругать и критиковать, в итоге и получит лишь ответную ругань и
критическую болтологию.

Тот кто настроен на креативное русло - достигнет и созидательных результатов. Неважно каких -
отрицательных с точки зрения того, кто их будет оценивать и принимать или положительных.

Помните - любые оценки - это известная доля субъективизма, а потому не ищите позитива там,
где сами плодите и порождаете негатив.

Начинайте изменяться начиная с прямо сейчас и прямо с себя. И только потом уже глядя
по-сторонам.

И да, запомните наконец, эту простую истину -

Искреннее и доброжелательное отношение - вот ответ на любые вопросы и любые проблемы,
которые будут решаться в этом случае как бы сами собой.

Любая неудача переносится легче, если это искренне и без злобы и лишнего, излишнего
негатива.

Любой успех однозначно определяется заранее позитивной оценкой и настроем на результат,
даже если задача заведомо кажется нерешаемой или в ходе работы выясняется таковое.

Решение всегда есть, его всегда можно найти. Но имеется в виду такое - которое
даст положительный результат, а не отказ от работы или откат от проблемы.

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

Только так и никак более.

Простите, но увы, я не даю рецептов, на гарантированные результаты.

Они всегда рождаются в труде и в борьбе. Сказать всегда проще, чем
сделать.

Будьте всегда людьми не только слова, но и дела.

Не воспринимайте всё вышесказанное как простую формулу или рецепт.

Ошибка именно в том, что всё пытаются воспринимать просто и "КАК ЕСТЬ".

На самом деле не всё "ПРОСТО" и не всё следует понимать "КАК ЕСТЬ".

Забудьте про такие стереотипы.

Искать позитив и генерировать его это не одно и то же.

Здоровое зерно будет расти только на здоровой почве. Даже если Вы заранее
ложите в почву здоровое зерно, не надейтесь просто на то, что раз
оно здорово, то и плоды его тоже будут здоровыми. Почва тоже должна
быть здоровой, а если нет - то должна быть оздоровлена.

Так и человек. Не может генерировать или воспринимать позитив, если
сам он изнутри не позитивен. Это будет лишь притворство и ничего
более.

Путь этот труден и извилист.

Вы наверное уже устали от такого "менторского" и "назидательного" стиля.
Умных мыслей и установок.

Добро и зло существуют и сосуществуют в тесной связи и взаимозависимости.
Одно не может быть без другого. Как день без ночи и наоборот.

Одно перетекает в другое, плавно и не плавно, существуют и сосуществуют
самые разнообразные его формы и виды. Мыслимые и немыслимые, очевидные
и совсем мало распространенные, даже уникальные, маниакальные и 
малоизученные.

Носителей настоящей истины нет. Всё решается в конкретных обстоятельствах.

Насколько обыденно и банально бы это не звучало, но сказав всё вышеуказанное,
усвоив его, всё равно знайте, что всегда есть и будут и другие
варианты правильного пути. Другие мнения и решения.

И никакое из них не будет являться истиной в последней инстанции.
Потому что её нет и быть не может.

Всё применимо только в конкретных условиях и обстоятельствах и результат
и его достижимость, и достижение результата.


Почему мы не живём вечно и нам кажется, что мы делаем что-то уже бесконечно ?

Мудрость.

Она не приходит сразу и ко всем.

Мудрыми становятся и остаются также не сразу и не все.

Все мы разные.

У каждого из нас свой путь.

Свои трудности и проблемы.

Но и свои радости и достижения.


Нет такого человека, который бы был АБСОЛЮТНО СЧАСТЛИВЫМ.

Счастье достигается тем, что постоянно его надо искать и есть неиссякаемая
надежда на то, что Мы его найдём !

На этом пожалуй я закруглюсь.

Простите если утомил Вас своими философскими или какими-либо еще высказываниями.

Просто вылилось, как говорится. 

Видимо хотелось сказать и оно свершилось.

Далее мы будем работать более предметно и опять
займёмся вышеуказанными вопросами.

Итак пример 
c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple

Пример включает 2 приложения:

simples - т. е. simple Server

и

simplec - т. е. simple Client

Оба приложения являются консольными. Выполнив их сборку в среде MSVS 2005 или выше
Вам нужно будет запускать их из окна коммандной строки Windows, чтобы
увидеть результат их работы.

Если любой из примеров запустить с параметром тире -

simples -
simplec -

То будут выведены возможные параметры коммандной строки для запуска данного приложения.


cd C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\
netds\winsock\simple\server\Debug

C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\server
\Debug>simples -
Usage
simples -p [protocol] -e [endpoint] -i [interface] [-4] [-6]
Where:
        -p protocol   - is one of "TCP" or "UDP"
        -e endpoint   - is the port to listen on
        -i interface  - is the string local address to bind to
        -4            - force IPv4
        -6            - force IPv6

Defaults are TCP,5001 and INADDR_ANY and IN6ADDR_ANY (if IPv6 present)


Кстати, чтобы не набирать в коммандной строке длинные строки, можно один раз набрать их
в текстовом редакторе, например в Блокноте, а потом просто копировать и вставлять
в окно коммандной строки.

Для примера я запустил сервер с такими параметрами


C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\server
\Debug>simples -p TCP -e 80 -i 127.0.0.2
socket 0x7c bound to address 127.0.0.2 and port 80


	
Т. е. задал для сервера использование протокола TCP, подключил к порту 80 и привязал к
ip - 127.0.0.2

Сервер работает и остается в памяти пока не будет нажата комбинация клавиш [Ctrl] + [C].
Он ожидает запросов от клиента.


Клиент, это приложение simplec.

Запускается с такими параметрами -
	
simplec -p  -n  -e  -l 


Значит надо указать те же параметры, что были указаны у simples, чтобы клиент мог успешно
подключиться.
simplec -p TCP -n 127.0.0.2 -e 80 -l 10


Запуск simplec с указанными параметрами осуществляем в отдельном окне коммандной строки
Windows.


C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\client
\Debug>simplec -p TCP -n 127.0.0.2 -e 80 -l 10
Client attempting connection to: 127.0.0.2 port: 80
Connection established...
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 0]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 1]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 2]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 3]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 4]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 5]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 6]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 7]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 8]] from server
wrote 40 bytes
read 40 bytes, data [This is a small test message [number 9]] from server


Отправка/получение тестовых данных происходит 10 раз подряд (циклически), поскольку
я указал при запуске simplec параметр -l 10.

Как работает сервер simples Мы рассматривать здесь не будем, т. к. это не
нужно для моей непосредственной задачи. У меня серверная часть реализована не на
c++, а на php.

Вы, при желании и наличии такой необходимости, можете сами изучить исходный код
simples взяв его из Windows SDK 7.0.
О том, где скачать его и как с ним работать я уже рассматривал ранее.

Как лучше к этому подойти Вы сейчас и узнаете на примере изучения simplec.


Основная проблема с которой Вы возможно столкнетесь, по крайней мере с ней
сталкивался я, это работа со строками.

В примере simplec используются обычные символьные строки char. Но большинство
Windows - приложений работают с unicode.

Для работы с unicode, а точнее чтобы от него не зависеть, нужно использовать
так называемые generic строки - там где вы явно задаете строку применять оператор _T


CString cs_str = _T("Simple string sample");



Если указывать L


CString cs_str = L"Simple string sample";


То сразу будет использоваться unicode, независимо от кодировки, которая задана в настройках
 проекта.

Если же использовать _T - то в зависимости от настройки проекта будут применяться либо ANSI
строки, либо unicode.

В большинстве приложений Windows всегда используется unicode. Но на низком уровне, с которым
работает
Windows Sockets 2 ведется работа с каждым байтом информации отдельно. Поэтому вопрос
кодировки
и преобразований из одной кодировку в другую очень важен, и когда Вы будете разрабатывать
свои приложения с использование Windows Sockets 2 API, то волей-неволей столкнетесь
с проблемой
использования строк и их различных видов.

Основные ошибки какие могут быть - это утечки памяти - memory Leaks и Access Violation.
Когда какая-то память выделяется, но
не освобождается, или идёт обращение к участку памяти, в непредусмотренном адресном
пространстве.


Как добиться наилучшего понимания ? Вам нужно будет плотно работать с приложением в
режиме отладки Debug, а также писать небольшие простенькие прилоежния - я их называю
ТЕСТОВЫЕ. В таких приложениях по возможности размещаем проблемный код.

Если он связан с другим кодом, упрощаем его так, чтобы он получился как можно
меньшим. Там где, например подразумевается выполнение какого-то большого блока
кода для получения заранее предвиденного результата - просто используем
готовое значение для подстановки - тогда можно будет и не включать в ТЕСТОВОЕ
приложение этот БОЛЬШОЙ КУСОК кода.

В тестовых приложениях можно экспериментировать - чтобы лучше понять ту или 
иную особенность, которая не совсем понятна или вызывает ошибку.

Поскольку вариантов работы может быть множество, а правильный, естественно
никто вам не укажет, нужны будут собственные эксперименты с кодом.

И без ТЕСТОВЫХ приложений тут никак не обойтись.

Приведу небольшой пример, который продемонстрирует какие вопросы
могут возникать и как они решаются опытным путём.

Документация и мануалы всегда дают какой-то пример, но чтобы
его лучше понять нужно писать собственный код и экспериментировать.

Например у нас объявлена символьная строка char -


char            hoststr[NI_MAXHOST],


NI_MAXHOST это системная константа равная 1025.

Чтобы очистить строку от неинициализированных данных применяем функцию -


SecureZeroMemory(&hoststr, sizeof(hoststr));


Но может возникнуть 2 вопроса:

Почему &hoststr, а не просто hoststr ?


Т. е. так - 


SecureZeroMemory(hoststr, sizeof(hoststr));



И почему sizeof(hoststr), а не strlen(hoststr) ?

Т. е. так -


SecureZeroMemory(hoststr, strlen(hoststr));



Такой код -


SecureZeroMemory(&hoststr, sizeof(hoststr));



Будет правильным, только если строка определена как
массив элементов char -



char            hoststr[NI_MAXHOST],


Но если имеется такой массив -


char *hoststr = "localhost";


Или 


char *hoststr;


Когда строка формируется динамически и её длина может быть любой в допустимых 
пределах.


В этом случае - char *hoststr - это уже не массив, а указатель на массив и очищать его
нужно не так -


SecureZeroMemory(&hoststr, strlen(hoststr));


А так -


SecureZeroMemory(hoststr, strlen(hoststr));


Потому что &hoststr - так мы очистим не массив, т. е. не значения которые хранятся
в буфере строки, а значение указателя - он станет равным 0 или NULL. При
этом считается, что его память была освобождена.

И тут возникает сразу 2 ошибки:

1) Memory Leaks - утечки памяти - потому что указателю было присвоено NULL значение,
без предшествующего освобождения буфера оператором delete [] hoststr;  //только
если буфер создавался динамически -


char *hoststr = new char[ request_str_symbols_count ];


request_str_symbols_count - подразумевается, что это некоторая числовая константа.

2) Поскольку hoststr был обнулен, то попытка обращения к нему вызовет ошибку
Access Violation - поскольку память уже недоступна в переменной hoststr.



И второй вопрос - о разнице между sizeof и strlen -



SecureZeroMemory(&hoststr, sizeof(hoststr));
SecureZeroMemory(&hoststr, strlen(hoststr));


Разница здесь в том, что функция sizeof - возвращает длину всей выделенной памяти для буфера 
hoststr в байтах, а strlen возвращает длину строки hoststr - количество символов до первого
втретившегося символа \0.

Понятно, что когда hoststr еще только был объявлен, но не очищен, там содержатся
какие-то неинициализированные данные, т. е. по сути мусор. И неизвестно есть ли
там символ \0 - символ конца строки. А если и есть - то непредсказуемо - в какой позиции
он находится.


Так что выполняя команду 


SecureZeroMemory(&hoststr, sizeof(hoststr));


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


Но команда - 


SecureZeroMemory(&hoststr, strlen(hoststr));


Является логически неправильной, т. к. будет очищена в лучшем случае часть строки
до первого встретившегося 0 байта. Ну а может быть, что такого символа
вообще не окажется в неинициализированных данных, тогда hoststr останется
неинициализированной.


Конечно если строка уже была инициализирована - например туда уже было
помещено значение строки, тогда команда будет иметь эффект. Но опять же
очищен будет не весь буфер, а только часть его до первого символа
нуль-терминатора (т. е. \0 ).


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

Например, от обилия таких вопросов, я даже спросил себя:
Ну почему, почему в C++ работа со строками так сложна и неочевидна,
не всегда ясно и понятно что происходит и почему возникает ошибка
в том или ином месте.

Ошибки как я уже говорил те же самые - Access violation и memory leaks.

Ответ звучит просто - возьмите язык php - он делался по-сути для
удобной работы со строками ! Потому что вся информация, которую
в php приходится обрабатывать и выводить - это, как правило,
строковые данные.

Так что, как видите, для работы со строками существует ЦЕЛЫЙ ЯЗЫК php !!!
Так что понятно, что c++ не может охватить всех нюансов, особенно
если Вы о них даже не знаете.

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




Теперь можно приступать к изучению кода -

c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\
client\simplec.cpp


Функция с которой начинается исполнение - 
int __cdecl main


Сначала запустить сервер -

Открываем окно коммандной строки Windows - Пуск - Программы -
Служебные Windows - Коммандная строка

cd C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\
server\Debug

simples -p TCP -e 80 -i 127.0.0.2

Не закрываем окно.


Теперь работаем с приложением клиентом - simplec


simplec -p TCP -n 127.0.0.2 -e 80 -l 10

Я буду запускать клиент из MSVS в режиме отладки,
поэтому эти параметры укажу в -

Command Arguments как описывалось на странице 4
-p TCP -n 127.0.0.2 -e 80 -l 10

c:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\netds\winsock\simple\
client\simplec.cpp

Итак шагаем по коду в режиме отладки (как это делать тоже уже описывалось
на странице 4)


Сначала в цикле обрабатываются введенные агрументы коммандной строки -

    // Parse the command line
    if (argc >1)
    {
        for (i=1; i < argc; i++)
		
		
	Отладочные значения могут оказаться такими -
	
address_family = 0
		
		
socket_type = 1


server_name = 0x007f4d6d "127.0.0.2"
//т. е. через параметр server_name мы задаем url по которому надо обращаться к серверу
//для решения вашей задачи можно подставить любой сервер,
для примера я использую megainformatic.ru


port = 0x007f4d7a "80"
//для megainformatic.ru также нужно будет использовать этот порт


maxloop = 10
//количество итераций отправки данных клиентом.



Небольшое отступление.

В чём отличие в применении символов & и * в языке c++ ?

Символ * - это указатель на адрес переменной, а не на её значение, если символ
звездочки применяется к параметру функции -

пример -


SearchCRLF(const char * strData, size_t data_length, size_t * found_at)


в данном случае переменные strData и found_at представляющие параметры
функции SearchCRLF будут указателями на адрес - или передаются по-ссылке
(имеют ссылочный тип).

strData при этом указывает на адрес массива из элементов типа char

Поскольку объявлена как 


char * strData


Ключевое слово const означает, что данные указателя
являются неизменными -
т. е. изменяться внутри функции не будут (иначе это вызовет ошибку).

Таким образом, в операциях присваивания strData может находиться только
по правую сторону от знака =.

Необходимость ключевого слова const вызвана тем, что
если мы опустим его - 

будет считаться, что данные в strData можно изменять.

Т. е. функция может изменить переданные по-ссылке в strData данные и strData
может находится в операциях присваивания как с левой, являясь приемником
значения, так и с правой - являясь его источником.


Поскольку все char строки являются массивами, то негласно считается, что


char * strData


и


char strData[100];


По-сути одно и то же - только в первом случае указатель является адресом
на блок данных, размер которого неизвестен, а значит может меняться
динамически.

Во-втором случае - блок представляет адрес на данные заранее известного размера -
из 100 символов (или байт), поскольку размер char - это размер 1 байта
в памяти.


Посмотрим на второй параметр функции -


size_t * found_at



прежде чем, попасть в функцию, параметр может быть определен так -


size_t search_result = -1;

//...

//и где-то дальше он передается в функцию

SearchCRLF(strData, strDataSize, &search_result);



Как видим при search_result появился значок &

Он как раз и означает, что в функцию будет передано не значение переменной search_result,
а указатель (адрес), по которому хранится данное значение.

Поскольку функция была объявлена так -


void SearchCRLF(const char * strData, size_t data_length, size_t * found_at)
{
	//...
	
	//то мы можем изменять значение параметра found_at тем самым вернув из
	//нашей функции измененный результат
	
	*fount_at = 0; //так мы изменяем значение параметра found_at переданного по ссылке
	//(указатель на адрес как было указано выше)
}


Чем это отличается от варианта 

void SearchCRLF(const char * strData, size_t data_length, size_t found_at)
{


?


А тем, что если параметр found_at передается по-значению, то внутри функции
мы его изменить не можем.

Таким образом, в операциях присваивания внутри тела функции,
он может появляться только с правой стороны  -


void SearchCRLF(const char * strData, size_t data_length, size_t found_at)
{

	//...

	size_t some_var = found_at; //вот так
	
	//а вот так мы его уже изменить не сможем - будет ошибка
	found_at = 1;
	
}


Как видим в этом и состоит необходимость применения слова const для
строковых данных из символов char.

Для простых типов, таких как size_t - представляющих беззнаковое целое число,
применение оператора * автоматически подразумевает, что параметр
передается по-ссылке, а значит может быть изменен в теле функции.

Если * нет - значит передается значение.

В случае со строками это не является очевидным - строки в любом случае
представляют из себя массивы, а значит хранят указатель на адрес массива,
а не вереницу значений его элементов.

Поэтому когда мы указываем слово const -


const char * strData


Подразумеваем, что строка будет передаваться как бы "по-значению" и изменить
её будет нельзя.

Ну а когда const не указан - можно.


Вот такое небольшое отступление.

Далее мы продолжим изучение примера simplec.


Для решения стоявшей передо мной задачи нужна была всего 1 итерация.
Либо несколько - в случае ошибки соединения с сервером - это тоже
нужно будет предусмотреть и реализовать.


Далее всё идёт обычным порядком описанном в мануале по Win Sock 2
(где и как его прочитать я также упоминал в 
Windows Sockets 2, ping, Windows SDK 7, чем открыть hxs файл - страница 4) -


    // Load Winsock
    if ((retval = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
    {
	
	
	//...
	
	// Make sure the wildcard port wasn't specified
	//тут убеждаемся не используется ли порт по-умолчанию - если задан 0 для него
    if (_strnicmp(port, "0", 1) == 0)
        Usage(argv[0]);

	Для нас важен именно 80 порт т. к. simples я запустил именно с 80 портом
	
	Да и megainformatic.ru также слушает этот - 80 порт.
	
	    retval = getaddrinfo(
                        server_name,
                        port,
                        &hints,
                        &results
                        );
//? определяется имя сервера если задан его ip и наоборот.
// Нужно будет проверить это задав сервер как megainformatic.ru
						
	
	
	
	Если всё нормально и ошибок нет -
	
	начинаются попытки коннекта -
	
	
	while (addrptr)
    {
        conn_socket = socket(addrptr->ai_family, addrptr->ai_socktype,
			addrptr->ai_protocol);

	//...
	
	retval = getnameinfo(
					addrptr->ai_addr,
					(socklen_t)addrptr->ai_addrlen,
					hoststr,
					NI_MAXHOST,
					servstr,
					NI_MAXSERV,
					NI_NUMERICHOST | NI_NUMERICSERV
					);			
					
					//ага, вот оно ! тут пытаемся получить данные если
					//задано именно доменное имя
	
//...


    // Make sure we got a connection established
    if (conn_socket == INVALID_SOCKET)
    {
        printf("Unable to establish connection...\n");
        goto cleanup;
    }
    else
    {
        printf("Connection established...\n");
    }

Если ошибок нет - в консоль выведет	Connection established...

Т. е. соединение успешно установлено.


Далее происходит самое главное и интересное, ради чего собственно всё и делалось -


    //
    // cook up a string to send
    //
    loopcount = 0;
    for (;;)
    {
	
		//в буффер заносим некоторый текст, который будем передавать серверу
		//в моей основной задаче этот текст - это запрос у сервера данных:
		//например такой: 

GET /?page=474 HTTP/1.1\r\n
Host: megainformatic.ru\r\n
Connection: Close\r\n


Таким образом, на примере приложения simple из Windows SDK 7
можно изучить все необходимые шаги для базовой работы с Windows Sockets 2,
аналог которого есть в языке php и называется fsockopen -

о нём я рассказывал в статье -
Работа с сокетами fsockopen из php

На этом ползволю себе закруглиться, т. к. более подробно
изучить пример simple Вы сможете сами - скачав Windows SDK 7.



к странице 1 к странице 2 к странице 3 к странице 4 страница 5 к странице 6

подробнее

     
  Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2)  
     
  модель коммандного центраСкачать готовую модель вы можете кликнув по картинке.  
     
  Этот объемистый урок расскажет Вам как научиться создавать нечто подобное: всем известно, что вышла игра StarCraft 2 компании Blizzard. Об этой игре ходят легенды. Но не дожидаясь когда вам удастся засесть за игру, а также для того, чтобы пополнить свои навыки и умения попробуем вообразить себя "крутым дизайнером" (прямо как из Blizzard) и попробовать создать модель и текстуру для коммандного центра из StarCraft 2.  
     
 

Часть 5

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

 
     
  О создании текстурных разверток подробно рассказывалось в статье - Создание текстурной развертки для модели автомобиля .  
     
  Стоит только добавить, что в качестве вспомогательной текстуры более удачной можно считать примерно такую текстуру -  
     
   
     
  Почему нужно использовать примерно такую вспомогательную текстуру (или подобную ей)? При создании текстурной развертки Вы сможете наблюдать данную текстуру на поверхности самой модели. Размер и форма узора из треугольников на текстуре позволят Вам задавать для проецируемых на развертку граней примерно сопоставимые размеры - т.е. избежать излишнего уменьшения или увеличения отдельных элементов. Отслеживать этот процесс позволяет именно размер и форма получаемого узора на поверхности модели.  
     
  В результате Вашей работы Вы должны получить следующую текстурную развертку для модели Коммандного Центра -  
     
  скачать модель и развертку (356 Кб)  
     
  Модель с готовыми текстурными координатами также можно скачать здесь. (356 Кб).  
     
  Для вывода созданной текстурной развертки в файл нужно выполнить следующую последовательность действий -  
     
  - Выбрать в сцене объект для которого осуществляется вывод (в нашем случае это например Основа Коммандного Центра).  
     
  - Осуществить команду Render > Render To Texture и в открывшемся диалоговом окне осуществить последовательно настройки как показано на рисунке  
     
   
     
 

1) Добавление элемента для отрисовки, откроется новый диалог в котором нужно выбрать Диффузный цвет, т. е. DiffuseMap

2) Задаете имя и расширение для создаваемого файла

3) Задаете результирующий слот в настройках текущего материала куда будет помещена созданная текстура

4) Задаете размер текстуры в пикселях (все текстуры квадратные)

5) Осуществляете процесс вывода изображения развертки в файл

 
     
  Вот например предварительный вид текстурной развертки Основания Коммандного Центра -  
     
   
     
  Теперь можно слегка видоизменить созданную текстуру в Photoshop для обеспечения бесконфликтного наложения разверток последующих объектов составляющих Коммандный Центр - например так -  
     
   
     
  И в редакторе материалов заменить использованную вспомогательную текстуру на созданную -  
     
   
     
   
     
  Обратите также внимание: Если для вспомогательной текстуры Вы использовали Tiling установив флажки Tile и указав количество тайлов по U и V, то для новой созданной текстуры тайлинг уже использовать не нужно, т.к. развертка не будет тайловой!!! Вам нужно установить параметры тайлинга как показано на рисунке выше (Tiling U = 1; V = 1)  
     
  Далее повторяете данную последовательность действий постепенно добавляя на текстуру развертки всех составляющих Коммандный Центр объектов.  
     
  Вот что примерно может получиться в результате -  
     
   
     
  Цвет текстуры задавался для отдельных разверток посредством корректирующего цветного слоя в Photoshop.  
     
  Как видите получилась достаточно компактная, но не использующая всего пространства текстурная развертка, поэтому придется повторить процесс снова уделив каждому из объектов максимум пространства.  
     
  Вот что примерно должно получиться в итоге -  
     
   
     
  Теперь по изображению полученной развертки можно приступить к самому интересному - рисованию текстуры! Этим мы и займемся далее.  
     
  [назад] [далее - рисуем текстуру по развертке]  
     
подробнее

Быстрый подсчёт ключевых слов в статье


Для того, чтобы быстро прописать значения мета-тегов в статье сайта нужно посчитать статистику встречаемости различных слов в статье и выбрать те слова, которые будут ключевыми.

Это можно сделать вручную - пробежав глазами весь текст статьи и выбрав нужные слова.

Другой вариант - написать на php специальный скрипт (модуль), который будет получать на вход файл контента анализируемой статьи, а на выходе будет выдавать статистику слов в этой статье.

Наиболее простой вариант работы с таким модулем - локальный

Т. е. Вы устанавливаете на свой компьютер локальный сервер (типа набора DENVER), а затем выполняете скрипт из браузера локально, обращаясь к локальному серверу localhost.

В этом случае на вход скрипта достаточно подать название файла анализируемой статьи в виде параметра ?pf=paper_file.txt

Чтобы продемонстировать работу такого скрипта (я назвал его keywords generator или кратко kg) перейдите по следующей ссылке - kg

Вы увидите результат обработки данной статьи, которую Вы в данный момент читаете :)))))

Вторым параметром - &v=10 Вы можете задать отображение только таких слов, количество которых в статье превышает заданное значение, т. е. в данном случае - 10

Например так - kg

Попробуйте вручную менять значение параметра &v=10 в адресной строке Вашего браузера и нажимая ENTER и увидите сами :)))))

В следующих статьях Мы с вами рассмотрим:

как написать скрипт подсчёта ключевых слов - скрипт подсчёта ключевых слов
и Вы воочию увидите модуль для сайта, который позволяет пользователю выгрузить файл контента статьи на сайт и получить по нему статистику встречаемости ключевых слов - своего рода онлайн-сервис ключевых слов :))))

Удачи ВАМ !!!



Изучаем Flash

Вашему вниманию предлагаются статьи Тимонина Андрея впервые публикуемые на сайте Мега Информатик -

автор: Тимонин Андрей

дата публикации на сайте Мега Информатик: 15.11.2012

Тимонин Андрей - Несколько слов о себе

Flash. Подготовка к работе.

Flash приложения распространены в интернет индустрии и преобладают в различных социальных сетях. В этой статье мы узнаем, что используется для разработки таких приложений.

Flash. Hello world

Создаем наш первый проект.

Flash. Flash. Экспорт SWC библиотеки.

Эта статья будет посвящена основам flash программирования. Здесь мы разберемся с экспортом библиотеки из Adobe flash.



Тимонин Андрей - статьи о веб программировании, создании игр

megainformatic live chat
Начать беседу
X
 

Оставленные комментарии



fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
megainformatic Размещение баннерной рекламы у нас
Время загрузки: 0,0940