Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Server Socket и прием данных - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Распараллеливание метода нахождения обратной матрицы http://www.cyberforum.ru/cpp-beginners/thread1142204.html
Здравствуйте! Помогите пожалуйста. Мне нужно распараллелить метод нахождения обратной матрицы. Посоветуйте литературу, касающуюся этой темы. Просто никогда не делал на практике...
C++ Вычислить средние арифметические значения Здраствуйте. Можете помочь сделать программу? Вот такое задание и надо использовать процедуры. Вычислить средние арифметические значения отрицательных элементов заданных массивов F1 (12), F2... http://www.cyberforum.ru/cpp-beginners/thread1142200.html
C++ Ошибка при компиляции
Здравствуйте! При попытке компиляции кода выкидывает ошибку "fatal error LNK1120: 1 неразрешенных внешних элементов" #include <iostream> #include <locale.h> using namespace std; class elem...
Поместить код символа в переменную. Sprintf C++
char a; int i=1; char b; sprintf(b,"%d",i); a=b; Собсно,ведь код сводится к тому,чтобы записать int i в char a.Но конструкция явно индуская. Может есть способ по-проще?
C++ Вывод чисел с запятой через wsprintf http://www.cyberforum.ru/cpp-beginners/thread1142182.html
Добрый день! Как правильно вывести знаковое число типа double? Целые числа выводил вот так: wchar_t buf; wchar_t buf_1; int sl = wsprintf( buf, L"Результат сумма:%d", m_Result_sum,"\n"...
C++ Ошибка по среди выполнения Привет. Я наверное надоел вам) Ну дело в том что у меня сломано бедро и я не хожу, а лабы сдавать надо Нужна помощь. Надо посчитать среднее арифметическое из парных чисел, всего 12 чисел надо... подробнее

Показать сообщение отдельно
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45

Server Socket и прием данных - C++

08.04.2014, 11:45. Просмотров 1143. Ответов 12
Метки (Все метки)

Доброго времени суток.
Никак не могу разобраться с компонентом ServerSocket. Итак, ситуация. У меня есть модуль XBee WiFi, на него с платы подается сигнал на вход по UART, модуль передает данные мне на компьютер, модуль использует TCP/IP протоколы, чтобы доставка пакета была гарантированна. Сервер работает асинхронно (stNonBlocking).
Так вот, проблема номер раз. Если модуль выходит из зоны покрытия, а потом снова появляется в ней, к примеру я дерну питание или вырублю вайфай на компе, выбивает асинхронную ошибку 10053. От этого избавиться можно, ладно. Беда в другом.
Расшарил сеть сниффером, вот какая ситуация. Я так понимаю что соединение с другой стороны, со стороны модуля, открыто и тот продолжает забрасывать данные в никуда, набивая свой буфер (IP протокол ведь TCP) но когда связь налаживается, вижу что от компьютера приходит ответ, мол пакет полчуен, ОК, но ServerSocket упрямо отказывается набивать мой массив, продолжая слушать. У кого есть какие идеи на этот счет? Пробовал отключать соединение по таймеру со своей стороны если данные не приходят, скажем 5 секунд, но тогда и вовсе соединение не восстанавливается, connect не происходит на моем уровне. Хотя по снифферу показывает что с компьютера приходит ответ о получении пакета. Есть ли какие-то методы подхватить существующую попытку соединения с другой стороны и все таки вытаскивать данные из сокета, а не молчать пока информация поступает. Откуда я знаю что сервер не желает работать? Нет, сокет-то открыт, но мой вектор не набивается новыми элементами. Вот такие дела. Пробовал пробежаться по ивентам OnAccept и OnConnect, но они тоже не срабатывают при такой ситуации.
Проблема номер два: Я набиваю данными свой вектор таким вот нехитрым образом.
C++
1
2
3
4
5
6
7
c = Form1->ServerSocket1->Socket->Connections[0]->ReceiveLength(); //узнать длину пришедшего пакета
        Form1->ServerSocket1->Socket->Connections[0]->ReceiveBuf(buf,c);  //копирую в буфер пакет
                for(int i =0;i<c;i++)   //забиваю пакет в вектор поэлементно
        dataAll.push_back(buf[i]);
 
        Contime = 0;  //переменная таймера соединения
        Form1->Edit2->Text = r+=c;   //счетчик байтов
Проблема в обработке этих данных. Если пакеты приходят четко по моему протоколу:
2 1 1 2 2 2 2 = 30 байт
Двухбайтовый заголовок Длина пакета Адрес Счетчик 10 каналов Дискреты Checksum = 17 элементов

То все ок, обрабатываю данные легко:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(unsigned i=0;i<dataAll.size();)
        {
 
                if(dataAll[i] == 85 && dataAll[i+1] == 170) { //dataAll обьявлен как unsigned char, то есть данные в ней побайтово
                dataSort.push_back(dataAll[i]);   //dataSort вектор обьявлен как unsigned short
                dataSort.push_back(dataAll[i+1]);
                dataSort.push_back(dataAll[i+2]);
                dataSort.push_back(dataAll[i+3]);  i+=4;     }
                        else                              {
                                a=dataAll[i+1];        //счетчик, каналы и дискреты
                                a<<=8;                  //двухбайтовые значения
                                a+=dataAll[i];         //ничего лучше не придумал, чем сдвиг в переменной.
                                dataSort.push_back(a);  i +=2  }
 
         }
Но вот не в лабораторных условиях мой вектор будет забит искаженными пакетами, огрызками данных и прочей лабудой. Что-то не дойду до того как написать универсальный алгоритм, чтобы отшелушить заголовок, длину, адрес, чексумму. Оставить только каналы и дискреты.
Есть идея создать еще один вектор, копию того куда набиваются данные и с ним работать, резать там его и прочее, циклически отсеивать по пакету, по нахождению заголовка, отмеряя по длине и сверяя чексумму, обрезать пакет, копировать в новый вектор и удалять обработанные пакетики, уже сохраненные удобночитаемо. Подскажите метод такой работы с вектором. И буду благодарен если у кого-то есть лучшее решение обработки двухбайтовых значений.

Проблема номер три: Механизм сохранения у меня реализован не лучшим образом.
C++
1
2
3
4
 if (SaveDialog1->Execute()){
    std::ofstream output_file(SaveDialog1->FileName.c_str());
    std::ostream_iterator<int> output_iterator(output_file,"\n");
    std::copy(dataAll.begin(), dataAll.end(), output_iterator);
Подскажите как мне, к примеру, отмерять 30 байт и только потом переходить на следующую строку? Чтобы было видно что это вроде бы как пакет. Или еще лучше искать контрольную сумму, к примеру число 0x1010 (2байта) и после него делать "\n"?
Механизм считывания и занесения в буфер у меня вообще не реализован. Буду благодарен и за эту помощь.
Вопросов много, но что поделать..)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru