crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику Влад ::: Спасибо сказали: 46 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
27.10.2015, 10:33 "Склеивание" сообщений ТСР
Цитата(pwp2008 @ 26.10.2015, 19:49) *
Т.е. 4 байта уж точно не разрежутся ? Вообще, можно и 2-мя обойтись, надежней.
Сколько ждать полного буфера, длина, которого была заявлена в заголовке, ведь можем и не дождаться?
Надеюсь, что ТСР не переставит блоки, а будет все-таки давать их в порядке отправления.
Контрольная сумма меня особенно радует.

Разрежутся или нет четыре байта длины - никто тебе не даст никаких гарантий. Да это и не имеет значения. Просто вычитывай из сокета, пока не наберутся в начале посылки эти четыре байта. А потом вычитывай столько байтов, сколько заявлено в заголовке. Либо они дойдут, либо ты получишь ошибку связи и должен на нее как-то отреагировать. Да, TCP не переставит блоки, в этом можно быть уверенным.
pwp2008,
26.10.2015, 14:45 "Склеивание" сообщений ТСР
Цитата(pwp2008 @ 25.10.2015, 18:11) *
......Клиент получает только одно, но "склеенное" из 2-х сообщение. Хотелось бы
понять причины этого и по возможности "разделить" сообщения, чтобы они приходили на клиент в виде 2 сообщений.
......
и каждое сообщений приходит отдельно. Причем , уже при xxx > 11 .
Если xxx=1, то сообщения "склеиваются" и в таком исполнении.

Еще раз: протокол TCP ничего не "знает" ни о каких сообщениях. TCP просто передает поток байтов от передатчика (передающей стороны) к приемнику. Все.
Как он будет "склеивать" или наоборот "разрезать" твои сообщения - никто не дает никаких гарантий. В зависимости от загрузки сети при одном и том же исходном коде и одних и тех же таймаутах может быть и "склеивание", и "разрезание" сообщений - по внутреннему усмотрению драйвера TCP. Поэтому подбирать какие-либо таймауты, слоты и прочее - бессмысленно.

Правильный подход тебе описал коллега ViGOur.
pwp2008,
23.4.2013, 13:56 C++11

http://isocpp.org/blog/2013/04/trip-report...ng-2013-meeting

This afternoon in Bristol, UK, the ISO C++ standards committee adopted generic lambdas, dynamic arrays (an improved version of C99 VLAs), variable templates, reader/writer locks, make_unique, optional<T>, standard library user-defined literals, and a number of other language and library improvements – and approved the result as the feature-complete Committee Draft (CD) of Standard C++14 to be distributed for its primary international review ballot.

In addition to completing the C++14 CD document, the committee also made progress on three additional important parallel specifications that are on track to be published around the same time as C++14:

File system library (draft), based on Boost.FileSystem version 3.
Networking library, small at first and regularly extended.
“Concepts Lite” language extensions (draft), to express template constraints and improve template usability and error messages.
Iron Bug,
19.9.2012, 11:09 Книги по с++11 igor_bogomolov, Iron Bug, Sinttex, ssoft,
17.8.2012, 15:49 Предварительное объявление класса
Используй forward declaration:
#ifndef HEADER_H
#define HEADER_H

#ifdef WIN32
  #include <windows.h>
  #define EXPORT __declspec(dllexport)
#else
  #define EXPORT __attribute__((visibility("default")))
#endif

class Object;

EXPORT Object *GetObject();

#endif // HEADER_H
Snake174,
20.2.2012, 12:00 создание объектом собственной копии
Типичное решение (это классика):
class class1
{
    // ......
    // Тут некоторая общая функциональность классов class2 и class3, ради
    // которой они и входят в эту иерархию наследования.

    // клонирование объекта:
    virtual class1 *CreateCopy() = 0;
}

class class2 : public class1
{
    // .....
    virtual class1 *CreateCopy()
    {
        // некоторая реализация, специфичная для class2
    }
}

class class3 : public class1
{
    // .....
    virtual class1 *CreateCopy()
    {
        // некоторая другая реализация, с учетом особенностей class3
    }
}
good_game,
18.1.2012, 9:27 Доступ к железу в многопоточном приложении
r_13, мне вот как раз несколько (эххх.... изрядно уж!) лет назад приходилось разрабатывать похожую систему..... Несколько (много) "железных" устройств общались с компами по COM-портам и еще взаимодействовали друг с другом при этом.
Архитектура получилась следующая:
- на каждый тип "железного" устройства конструируется свой класс. Все эти "железячные" классы наследуют и поддерживают единый общий интерфейс (наследуются от абстрактного класса). Внутри класса для общения с устройством через COM-порт создаются два потока: на прием и на передачу, и две очереди: принятых сообщений и сообщений на отправку. Класс сам отслеживает таймауты, состояние устройства и прочее....
- количество экземпляров нужного класса определяется количеством железок данного типа, подключенных по каналам связи (у меня читалось из конфиг файла).
- для организации взаимодействия устройств друг с другом сконструирован еще один класс - условно, диспетчер. Диспетчер создает (читая из конфига) нужное число экземпляров конкретных классов.
- взаимодействие экземпляров между собой (как экземпляров одного класса, так и разных классов) идет по схеме "поставщик сообщений - подписчики". Все сообщения, принятые от конкретной железки, экземпляр соответствующего класса отдает диспетчеру. А диспетчер ведет реестр (список, лист) подписчиков, и отдает им сообщения. Здесь получается топология типа "звезда". Подписчик указывает, сообщения какого типа (а они разных типов) он желает получать. Каждый подписчик сам решает, как обрабатывать полученные сообщения. Прямого взаимодействия между железячными экземплярами нет, все идет только и исключительно через диспетчер.
- в одном компе - один диспетчер и несколько "железячных" экземпляров. А диспетчеры разных компов общаются по Ethernet по такой же схеме - на одном компе поднимается "сервер", по сути дела - диспетчер более высокого уровня. Здесь тоже топология "звезда".
Вот как-то так.....
r_13,
17.1.2012, 14:29 Доступ к железу в многопоточном приложении
Мне кажется, что это неправильно, что один модуль раздает другим указатели, и эти другие - делают, что хотят и когда хотят..... в том числе, могут обращаться к недоступному больше железу.

Лично я бы сделал бы несколько иначе а врхитектурном плане:
Один модуль ловит сообщения от USB _и_ общается с железом. Он предоставляет всем остальным модулям доступ к железу посредством доступа к _своему интерфейсу_, не предоставляя этим "остальным модулям" прямого доступа к железу. Запросы сторонних модулей могут ставиться в очередь и обрабатываться по логике, определяемой этим "железячным" модулем. Таким образом, все взаимодействие с конкретной USB-железякой инкапсулировано внутри этого модуля. Если железяка отключается, то этот модуль просто завершает все оставшиеся в очереди запросы неуспешно. Нет?
r_13,
30.11.2011, 10:11 namespace
И даже более того - даже если эту переменную объявить в хидере как статическую, в каждую единицу компиляции будет включен свой экземпляр переменной. Какие любопытные эффекты могут возникнуть оттого, что программист думает, что обращается к глобальной переменной x, а на самом деле обращается только к экземпляру, существующему только в данной единице компиляции - :unknw:
rp80, SEvg,
23.9.2011, 14:44 Какой принцип поправки на байты?
Такая штука называется "выравниванием". И связана она с тем, что чтение из памяти выровненных данных происходит быстрее, чем для невыровненных. Т.е. жертвуя некоторым (обычно небольшим) расходом памяти, увеличивается быстродействие программы.
Выравнивание в GCC и MSVC можно задать отличным от дефолтового с помощью #pragma pack. Попробуй сравнить результаты, например, при #pragma pack(1).

И да, с "лишними" битами (и байтами) ничего не происходит, - т.е. значения их содержат "мусор", на них нельзя полагаться.
AXELman4ever,
5.8.2011, 12:16 Испытательный полет
Небольшое уточнение.
Стрелка В.О. разделяет Неву на Большую Неву и Малую Неву. А Большая Невка ответвляется от Невы около Финляндского вокзала, как раз там, где стоит "Аврора", и в свою очередь дальше разделяется на Большую, Среднюю и Малую Невки.

А фотки красивые! Здорово!

PS: а я как-то вот не задумывался, почему Стрелка называется именно так. А вон оно как оказывается.....
AD, Litkevich Yuriy,
15.4.2011, 10:09 Опубликован драфт Стандарта C++0x
Последний драфт Стандарта.
Читайте: http://www.open-std.org/jtc1/sc22/wg21/doc.../2011/n3290.pdf

С очень высокой вероятностью, этот драфт (возможно, с мелкими орфографическими правками) станет новым давно ожидаемым Стандартом языка C++, после чего за текст Стандарта придется уже плотить денюжку. Налетай, пока даром!
BRE, igor_bogomolov, Iron Bug, panter_dsd, wiz29,
16.7.2010, 11:45 Вопрос по с++
Эта особенность синтаксиса описана у Скотта Мейерса в его "Эффективное использование STL" - Совет 6: Остерегайтесь странностей лексического разбора C++.
igor_bogomolov,
4.5.2010, 12:35 как пищать системным динамиком в виндовозе?
Beep Function

Generates simple tones on the speaker. The function is synchronous; it performs an alertable wait and does not return control to its caller until the sound finishes.

BOOL WINAPI Beep(
__in DWORD dwFreq,
__in DWORD dwDuration
);

Parameters

dwFreq
The frequency of the sound, in hertz. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).
Windows Me/98/95: The Beep function ignores this parameter.

dwDuration
The duration of the sound, in milliseconds.
Windows Me/98/95: The Beep function ignores this parameter.
Litkevich Yuriy,
22.4.2010, 19:03 Книги по C++ не совсем для начинающих
Александреску Андрей Современное проектирование на C++.pdf
Вандевурд и Джосаттис Шаблоны C++.djvu
Влиссидес Джон Применение шаблонов проектирования.pdf
Джосаттис Николай C++ стандартная библиотека.pdf
Мейерс Скотт Наиболее эффективное использование C++.djvu
Мейерс Скотт Эффективное использование C++.djvu
Мейерс Скотт Эффективное использование STL.djvu
Саттер и Александреску Стандарты программирования на C++.djvu
Саттер Херб Новые сложные задачи на C++.djvu
Саттер Херб Решение сложных задач на C++.djvu
Страуструп Язык C++ 3 изд.djvu
Элджер Джефф C++ библиотека программиста.pdf

(все книги существуют в электронном виде, гугл в помощь.... Но и в более традиционном бумажном - тоже! :-) )
Andrewshkovskii,
22.4.2010, 13:00 Использование сторонних библиотек
Посмотри экспорты этой DLL (например, утилитой Depends.exe или любой другой).
Если в экспортах "простые читаемые" имена типа OpenDevice и т.п., то DLL скорее всего "простая", написанная по всем правилам.
Если же в экспортах загадочные имена типа ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ, то все совсем не так радужно :) - другой компилятор такую DLL скорее всего не поймет; а если и поймет, то не факт, что сможет с ней правильно работать.
AD,
20.4.2010, 21:36 как протестировать оператор присваивания и конструктор копирования класса?
Юрий, просто Стандарт языка (п. 5.3.5 положение (clause) 2) четко описывает требования к выделению и удалению памяти:
- если память была выделена по new для единичного объекта (неважно, какого типа) - то удаляться она должна только delete для единичного объекта;
- если память была выделена по new[] для массива объектов (array form) - то удаляться она должна только delete[] для массива объектов (тоже array form) и никак иначе.
Иначе поведение программы не определено (Otherwise behavior is undefined, если мой склероз мне не изменяет). Причем, Стандарт никак не конкретизирует это "неопределенное поведение" - программе разрешается делать все, что ей заблагорассудится, начиная от порчи памяти и невоспроизводимых глюков, и вплоть до format C:.
Litkevich Yuriy,
20.4.2010, 19:12 как протестировать оператор присваивания и конструктор копирования класса?
Я немного подправил код.... Правда, не компилировал! Только то, что бросается в глаза при чтении.
Раскрывающийся текст
#include "ybuffer1.h"

#include <QtGlobal>


YBuffer1::YBuffer1(const char *abuffer, unsigned int asize)
{
    theSize = asize;
    theBuffer = new char[asize];
    // тут надо скопировать содержимое
    // поскольку abuffer - POD, то можно не делать цикл, а тупо использовать memcpy
    // или использовать std::copy
    memcpy(theBuffer, abuffer, asize);
    // хотя можно использовать и цикл... дело вкуса, но практически всегда memcpy выполняется
    // быстрее.
/*    
    unsigned int cnt = 0;
    while(cnt != asize){
        theBuffer[cnt] = abuffer[cnt];
        cnt++;
    }
*/
}

YBuffer1::~YBuffer1()
{
    // эта ошибка приводит к UB! Стандарт, 5.3.5/2
    /* delete theBuffer; */
    delete[] theBuffer;
}

YBuffer1::YBuffer1(const YBuffer1 &other)
{
    theSize = other.size();
    theBuffer = new char[other.size()];
    // тут надо скопировать содержимое
    copy(other, *this);
}

YBuffer1& YBuffer1::operator=(const YBuffer1 &other)
{
    // 1. проверить присваивание самому себе, типа i = i;
    if (this != &other)
    {
        // 2. перед выделением нового буфера надо удалить старый.
        // Еще лучше - использовать технику, безопасную по отношению к исключениям,
        // см. Саттер, "Решение сложных задач на C++"
        delete[] theBuffer;
        
        theBuffer = new char[other.size()];
        // тут надо скопировать содержимое
        copy(other, *this);
        theSize = other.size();
    }
    return *this;
}

void YBuffer1::copy(const YBuffer1 &source, YBuffer1 &destination)
{
    unsigned int size = source.size();
    Q_ASSERT_X(size == destination.size(), "YBuffer1::copy()", "size of objects not eqal");
    memcpy(destination.theBuffer, source.theBuffer, source.size());
/*    
    unsigned int cnt = 0;
    while(cnt != size){
        destination[cnt] = source[cnt];
        cnt++;
    }
*/
}

// здесь везде i должны быть строго < theSize!
    
const char& YBuffer1::at(unsigned int i) const
{
    Q_ASSERT_X(i < theSize, "YBuffer1::at()", "requested index too big");
    return theBuffer[i];
}

char& YBuffer1::operator[](unsigned int i)
{
    Q_ASSERT_X(i < theSize, "YBuffer1::operator[]", "requested index too big");
    return theBuffer[i];
}

char YBuffer1::operator[](unsigned int i) const
{
    Q_ASSERT_X(i < theSize, "YBuffer1::operator[]", "requested index too big");
    return theBuffer[i];
}
Litkevich Yuriy,
16.4.2010, 18:53 С++, оператор присваивания, каково должно быть поведение
Юрий, еще порекомендовал бы Джеффа Элджера "C++ библиотека программиста" и Херба Саттера "Решение сложных задач на C++" и "Новые сложные задачи на C++" - там конструирование и копирование объектов описано довольно подробно, в том числе с точки зрения безопасности и корректности состояния программы в целом.
(Книги есть в электронном виде, гуглятся.)
AD,
6.4.2010, 10:02 преобразование типа и классы
Не совсем так. Дефолтный конструктор, конструктор копирования, оператор = и деструктор относятся к специальным член-функциям.
Дефолтный конструктор генерируется компилятором автоматически, если не указан явно ни один пользовательский конструктор. Как правило, такой дефолтный конструктор пустой и успешно оптимизируется компилятором. Однако, для всех баз и членов вызываются их дефолтные конструкторы, если таковые существуют, иначе генерируется ошибка компиляции. Для баз - в порядке их объявления в списке наследования, для членов - в порядке их объявления.
Конструктор копирования не наследуется. Если не указан явно пользовательский конструктор копирования, то генерируется дефолтный конструктор копирования, который тупо почленно копирует все базы и члены класса. Порядок копирования тот же.
То же самое верно и для оператора =. Если не указан явно пользовательский оператор назначения (присваивания), то генерируется дефолтный оператор =, который тупо вызывает операторы = для всех баз и членов. Порядок тот же.
Тот же самый принцип действует и для деструкторов, с одним отличием: деструкторы всегда вызываются в порядке, обратном вызовам конструкторов.
AD,
3.2.2010, 11:20 Посчитать количество элементов в sizeof
Если в этом хедере есть поле, отвечающее за число карт - пусть называется chart_count, то new MAC4ChartHeader[chart_count];
Но в общем имей в виду, что MAC4ChartHeader* pChartsList = new MAC4ChartHeader[/*<размер массива>*/]; небезопасно в смысле потери ресурсов (памяти и хз еще чего) при исключениях. Поэтому лучше оберни в вектор или shared_array или собственный класс, реализующий RAII.
AD,
4.10.2009, 22:35 [C++] Генерация случайных чисел
Цитата(++Norton++ @ 4.10.2009, 22:47) *
Дело в том, что необходимо реализовать задачу перестановки символов в строке случайным порядком

1. А! Ну, так это в чистом виде random_shuffle(), именно для подобных задач она и предназначена.
2. Квалификатор std:: не забыл?
++Norton++, AD,
27.9.2009, 21:47 Шаблон проектирования Singleton (одиночка)
Юрий, по твоей реализации (кстати, практически классической!) у меня только два замечания:
1. конструкторы-деструкторы, которые ты хочешь скрыть, не обязательно реализовывать с пустым телом {}, достаточно просто объявить их private;
2. учти, что эта реализация работает только в строго однопоточной модели! В многопоточной ты либо "влетишь", либо надо реализовывать Double-Check Locking. Это, впрочем, тоже классика.

А так ничего, вполне себе красиво!...
AD,
13.8.2009, 16:11 Небольшие скрипты для выполнения в командной строке
Мда. Первая цель: дописываем к имени файла _123
@echo off
for %%f in (%*) do ren %%f %%~nf_123%%~xf

Вторая цель: меняем расширение на .ss
@echo off
for %%f in (%*) do ren %%f %%~nf.ss


Цитата
"... Таким образом, читатель уже понял, что среди надстроек над ДОС
бывают довольно бесполезные системы, которые только выглядят красиво,
а на самом деле отнимают время пользователя, память на дисках и
оперативную память ЭВМ. Обманчивая красота таких систем, однако,
сильно воздействует на неискушенных пользователей, которые не имели
практики работы на машине. Инерция мышления бывает столь сильна, что
авторам приходилось наблюдать, как люди, начавшие работать с подобной
надстройкой, впоследствии с трудом заставляют себя изучать команды ДОС.
Хочется предостеречь от этой ошибки читателей ..."

Из книги: ''Персональные ЭВМ в инженерной практике'', М. Радио и связь, 1989.
AD,
30.7.2009, 12:16 Аналог Q_PROPERTY
Посмотри, например, вот на это: http://www.progz.ru/forum/index.php?showtopic=27073&st=0
igor_bogomolov,

2 страниц V   1 2 >
RSS Текстовая версия Сейчас: 22.11.2024, 0:12