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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить средние арифметические значения http://www.cyberforum.ru/cpp-beginners/thread1142200.html
Здраствуйте. Можете помочь сделать программу? Вот такое задание и надо использовать процедуры. Вычислить средние арифметические значения отрицательных элементов заданных массивов F1 (12), F2 (14), F3 (16) и вывести их отдельно на экран.
C++ Ошибка при компиляции Здравствуйте! При попытке компиляции кода выкидывает ошибку "fatal error LNK1120: 1 неразрешенных внешних элементов" #include <iostream> #include <locale.h> using namespace std; class elem { http://www.cyberforum.ru/cpp-beginners/thread1142196.html
Поместить код символа в переменную. Sprintf C++
char a; int i=1; char b; sprintf(b,"%d",i); a=b; Собсно,ведь код сводится к тому,чтобы записать int i в char a.Но конструкция явно индуская. Может есть способ по-проще?
C++ Вывод чисел с запятой через wsprintf
Добрый день! Как правильно вывести знаковое число типа double? Целые числа выводил вот так: wchar_t buf; wchar_t buf_1; int sl = wsprintf( buf, L"Результат сумма:%d", m_Result_sum,"\n" ); int sd = wsprintf( buf_1, L"Результат произведение:%d", m_Result_mult,"\n" ); RECT rc;
C++ Ошибка по среди выполнения http://www.cyberforum.ru/cpp-beginners/thread1142177.html
Привет. Я наверное надоел вам) Ну дело в том что у меня сломано бедро и я не хожу, а лабы сдавать надо Нужна помощь. Надо посчитать среднее арифметическое из парных чисел, всего 12 чисел надо использовать оператор For для цикла Написал вот такое, но по среди работы ошибка Что то с числами, помогите #include "stdafx.h" #include <iostream>
C++ Вынести часть кода в функцию Скажите пожалуйста как сделать нахождение основных значений через функцию RESHENIE(), а ввод данных и вывод через функцию MAIN() #include <iostream> #include <fstream> using namespace std; int main(){ double Sc, Ss, a, r; ofstream out("output.txt"); ifstream in("input.txt"); in>>a>>r; подробнее

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

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

08.04.2014, 11:45. Просмотров 1060. Ответов 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"?
Механизм считывания и занесения в буфер у меня вообще не реализован. Буду благодарен и за эту помощь.
Вопросов много, но что поделать..)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru