Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
-3 / 11 / 5
Регистрация: 22.01.2011
Сообщений: 201

Отправить бинарные данные на сервер

29.05.2017, 17:19. Показов 3950. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема вот в чем, у меня есть бинарная строка, которую надо отправить на сервер и там с ней работать.
Я попробовал через POST библиотеки curl (программа на С++) Но если в бинарной строке встречается & сервер воспринимает это как окончание строки и начало новой
PHP
1
$time=$_POST['time'];
А мне надо получить в переменную полную строчку с бинарными данными, игнорируя & который php воспринимает как новую переменную.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.05.2017, 17:19
Ответы с готовыми решениями:

Сервер на сокетах: Нельзя повторно отправить данные на сервер
Делаю сервер на сокетах. Первая отправка данных на сервер проходит успешно, сервер получает и отвечает. Но повторный вызов события приводит...

Отправить данные на сервер
Здравствуйте, у меня такой вопрос, есть функция опредленная, которая кодирует текст. Мне нужно сделать так чтобы она кодировала то, что я...

Отправить данные на другой сервер
Как методом POST отправить данные на другой сервер не используя FORM?

29
-3 / 11 / 5
Регистрация: 22.01.2011
Сообщений: 201
05.12.2017, 08:16  [ТС]
Студворк — интернет-сервис помощи студентам
vxg, Я вчера проверил следеющее, отправил на сервер значения от 0 до 255
C++
1
2
3
4
5
6
         buffer1="";
          for(i=0; i<256; i++)
            {
              buffer1.append((char*)&i, 1);
              cout<<(char)(i);
            }
На сервере их получил, и бонально сверил
Единственно, код репласела пришлось поменять
C++
1
2
3
4
5
6
7
8
9
10
11
12
string encode(string bytes_to_encode)  // Г±ГЁГ±ГІГҐГ¬Г* êîäèðîâГ*Г*ГЁГї ïðè ïåðåäГ*Г·ГҐ Г*Г* ñåðâåð
{
  while (bytes_to_encode.find("&")!=string::npos)
    {
      bytes_to_encode.replace(bytes_to_encode.find("&"),1,"#$%");
    }
  while (bytes_to_encode.find("+")!=string::npos)
    {
      bytes_to_encode.replace(bytes_to_encode.find("+"),1,"#$:");
    }
  return bytes_to_encode;
}
Так как значение "#$%" равно 22 23 24 а я последовательно передавал коды символов.
Но не в этом дело, я ошибок не заметил, плюсы передаются таким образом корректно, амперсенды тоже.
Иными словами, тест показал что в принципе, проблем быть не должно, но они почему-то происходят.

vxg, попробую сделать как указали в примере.

Не могут ли данные терятся при??? Это я уже их sqlite их читаю.
PHP
1
2
$fourier = str_split($row['fourier'], 4); 
$y1[$ttt]=unpack("f", $fourier[$i])[1];
Хотя при построении графика, никаких ошибок в коде нет (скажем недостает байтов при распаковке...)
График строится только не так, либо попадаются большие либо маленькие значения, со степенью в тридцать и выше. Причем программа которая отправляет, выводит корректные значения. Да и не может некорректные, ибо сложив их она получает среднее которое также отправляется на сервер, и там оно верное. Если бы данные в программе были бы не верные, то и остальные значения были бы не верны, а они какраз верные.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
15.12.2017, 14:39
Цитата Сообщение от sfinexer Посмотреть сообщение
И проблема остается так и не решенная (в первом посте), в целом, я даже был бы не против передать данные строкой, но как их получить, если у меня при "multipart / form-data" не работает "$_POST [имя переменной]".
Не делайте replace и оставьте multipart/form-data.
А данные из stdin читайте следующим образом:
$data = file_get_contents('php://stdin');
echo $data; - тут будут сырые данные. Те самые байты, которые пришлете на сервер.

Добавлено через 1 минуту
Для $_POST фактически делается то же самое. Просто для удобства использования эта строка парсится и ее данными заполняется этот самый массив $_POST.
0
-3 / 11 / 5
Регистрация: 22.01.2011
Сообщений: 201
15.12.2017, 15:33  [ТС]
Undisputed, Так вот пост вроде должен передавать и получать, но гдето чтото не так...
Причем это "гдето" почемуто непонятно когда всплывает.
То что данные в программе верные и в массивах тоже, факт, иначе бы ничего не вычислялось, это былобы сразу видно.

Попробую переделать как сказали... убрав репласер.

Добавлено через 8 минут
Undisputed, Если бы я их терял постоянно я бы уже нашол ошибку.
У меня примерно пол процента запросов с ошибками. Иными словами теряется не весь пакет, а только его часть (причем порой посередине, или в ином месте), и это происходит примерно один раз в 200 пакетов. Может реже... Но происходит же!

Добавлено через 3 минуты
Система отправляет раз в 5 минут 26 пакетов, не связанных между собой. Теряется куски пакета примерно в каждом 200-500 ошибки данных.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
15.12.2017, 16:00
sfinexer,
1. Попробуйте отправить без replace
2. Убедитесь, что значение заголовка Content-Length всегда передается корректно.
0
-3 / 11 / 5
Регистрация: 22.01.2011
Сообщений: 201
15.12.2017, 16:14  [ТС]
Undisputed, попробую первое.
Второе
C++
1
curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, post_data.length());  // Длинна запроса
Тогда бы пакет был бы не полный, я бы заметил... у меня графики строятся вот так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  if ($print_graf==1)
  {
    $kol_element_mass=unpack("i", $row['kol_element_mass'])[1];  // количество элементов в массиве графика
    $kol_massivov=unpack("i", $row['kol_massivov'])[1];   // количество массмвов графиков
    $fourier = str_split($row['fourier'], 4);  // удалять пока нельзя, цели идут в основную таблицу
    $input_fourier = str_split($row['input_fourier'], 4);   // времена построения фурье
    $input_fourier_time = str_split($row['input_fourier_time'], 4);   // времена построения фурье
    $kol_dannych_in_mass = str_split($row['kol_dannych_in_mass'], 4);   // Количество точек на этои графике
    $dlinna_prognoza = str_split($row['dlinna_prognoza'], 4);   // Количество точек на этои графике
    $correlation = str_split($row['correlation'], 8);   // значение кореляции графиков
    //print ("kol_element_mass : $kol_element_mass   ");
    $kol_element=185;
    print ("<form action=\"?print_graf=0&end=-h0&h=$h&symbol=$symbol&id=$cel\" method=\"POST\">
    <input type=\"submit\" value=\"Скрыть все графики прогноза\"/>
    </form>
    ");
    // print ("$kol_element_mass !");
    for ($cicle=0; $cicle<$kol_massivov; $cicle++)
    {
      
      $dlinna_minit=unpack("i", $dlinna_prognoza[$cicle])[1];
      $kol_dannych=unpack("i", $kol_dannych_in_mass[$cicle])[1];
      $correlat=round(unpack("d", $correlation[$cicle])[1],5);  // значение кореляции на данном графике
      // распаковка
      $ttt=-1;
      for ($i=0; $i<$kol_element; $i++) //$i<90
      {
        $ttt++;
        $y1[$ttt]=unpack("f", $fourier[$i+$cicle*$kol_element_mass])[1];
Тоесть из прочтенные из sqlite строки вырезаю куски по $kol_element_mass длинной.
Тогда бы если например занные закончились бы на 2 блоке, то третий не отрисовался. А получается что гдето в середине данных ошибки...

Тут конечно может гдето в записи в базу ошибка...



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

Тоесть данные массива графика это строка, в нем блоки по 200 точек ($kol_element_mass) бывает так что часть блоков строится а часть нет((( это не может быть просто так не переданы данные...
Вот наглядный пример
http://forex.tiven.ru/?print_g... TI&id=1856
Второй график не полный, третий полный, далее построений нет
А вот пример как должно быть.
http://forex.tiven.ru/?print_g... SD&id=4352
Отправка идет темже самым кодом, но почемуто... в первом случае не корректно а во втором корректною

Добавлено через 2 минуты
И еще, если бы в программе данные бы были с ошибками, я бы на самом последнем графике получал бы ерунду полнейшую.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        cout<<" Количество данных = "<<post_data.size()<<"  байт"<<endl;
        // задаем  url адрес
        curl_easy_setopt(curl_handle, CURLOPT_URL, GO[21][1].c_str());
        //  Запрос в строке   ВОТ ЭТО РАБОТАЕТ ВРОДЕ ВЕРНО, Необходимо массив верно передать
        curl_easy_setopt(curl_handle, CURLOPT_POST, 1);
        // headers = curl_slist_append(headers, "content-type: multipart / form-data");
 
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, post_data.c_str());
 
 
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, post_data.length());  // Длинна запроса
        // выполняем запрос
        curl_easy_perform(curl_handle);
        seconds=prognoz.time+60*60*time_poias;
        timeinfo = localtime(&seconds);
        cout<<"\n             Время выдачи прогноза:  "<<asctime(timeinfo);
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
15.12.2017, 16:28
Цитата Сообщение от sfinexer Посмотреть сообщение
У меня часть данных отправляется, часть нет... хотя пост запрос одного пакета един и не разбит на куски
А вы уверены что данные именно "не отправляются", а не режутся на сервере?
Если не сработает, вариант с file_get_contents попробуй прочитать стандартный поток ввода в бинарном режиме
PHP
1
2
3
$handle = fopen('php://stdin', "rb");
$contents = fread($handle, 8192);
echo $contents;
0
-3 / 11 / 5
Регистрация: 22.01.2011
Сообщений: 201
15.12.2017, 16:55  [ТС]
Undisputed, я уже ни в чем тут не уверен если честно..............
Undisputed, не подскажите как тогда поток записать в файл, может это чтото прояснит.

Но тут тогда почему какие данные "режутся" а какието нет. У меня тут самая паршивая ошибка, я ее повторить толком не могу, и она еще проявляется не пойми когда(((((

Добавлено через 4 минуты
Было бы еще одно значение... а тут 14 килобайт бинарных данных, и ошибка проявляется раз в 200 отправлений, в случайном пакете. Но есть некоторые пакеты где ошибка чаще проявляется... раз в 10 пакетов... есть где редко... 200 это "среднее по больнице"

Добавлено через 18 минут
phpini
http://forex.tiven.ru/php.php
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
15.12.2017, 17:36
Цитата Сообщение от sfinexer Посмотреть сообщение
не подскажите как тогда поток записать в файл, может это чтото прояснит.
http://php.net/fwrite
0
-3 / 11 / 5
Регистрация: 22.01.2011
Сообщений: 201
15.12.2017, 18:56  [ТС]
Undisputed,
Формирование пакета:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        post_data+="symbol=";     //  название символа!
        {
          buffer1=GO[200+kolpara][1];
          post_data.append(encode(buffer1));  // кодирование и добавление в пакет
        }
        post_data+="&chena=";     //  цена
        {
          buffer1="";
          buffer1.append((char*)&prognoz.End_chen, 8);
          post_data.append(encode(buffer1));  // кодирование и добавление в пакет
        }
        post_data+="&volotilnost=";     //   Волотильность
        {
          buffer1="";
          buffer1.append((char*)&volotilnost[kolpara], 8);
          post_data.append(encode(buffer1));  // кодирование и добавление в пакет
        }
код передачи:
C++
1
2
3
4
5
6
7
8
9
10
11
   
      curl_easy_setopt(curl_handle, CURLOPT_URL, GO[21][1].c_str());
        //  Запрос в строке   ВОТ ЭТО РАБОТАЕТ ВРОДЕ ВЕРНО, Необходимо массив верно передать
        curl_easy_setopt(curl_handle, CURLOPT_POST, 1);
        headers = curl_slist_append(headers, "content-type: multipart / form-data");
 
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, post_data.c_str());
 
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, post_data.length());  // Длинна запроса
        // выполняем запрос
        curl_easy_perform(curl_handle);
попробовал так:
PHP
1
2
3
4
5
6
7
<?
$handle = fopen('php://stdin', "rb");
$contents = fread($handle, 8192);
$fp = fopen('data.txt', 'w');
fwrite($fp, $contents);
fclose($fp);
exit;
и так
PHP
1
2
3
4
5
6
<?
$handle = file_get_contents('php://stdin');
$fp = fopen('data.txt', 'w');
fwrite($fp, $handle);
fclose($fp);
exit;
Пусто в файле.

Добавлено через 19 минут
Заменив на
curl_slist_append(headers, "content-type: multipart / form-data");

Также, у меня пустой файл на сервере. он обновляется (дата изменения) но он пустой.

Добавлено через 9 минут
Тоже самое и
C++
1
2
3
4
5
6
7
8
9
10
11
        headers = curl_slist_append(headers, "cache-control: no-cache");
        headers = curl_slist_append(headers, "content-type: multipart / form-data");
        curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
        // задаем  url адрес
        curl_easy_setopt(curl_handle, CURLOPT_URL, GO[21][1].c_str());
        //  Запрос в строке   ВОТ ЭТО РАБОТАЕТ ВРОДЕ ВЕРНО, Необходимо массив верно передать
        curl_easy_setopt(curl_handle, CURLOPT_POST, 1);
 
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, post_data.c_str());
 
        curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, post_data.length());  // Длинна запроса
Никакие данные в файл не записываются.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
16.12.2017, 11:22
sfinexer,
Для начала попробуйте при записи так же использовать бинарный режим, wb.
Если будут проблемы, смотрите документацию, случаи когда возвращаются ошибки при использовании функций для работы с файлами.

А файл создается заново (поэтому и меняется дата) т.к у вас режим w.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2017, 11:22

Отправить данные GPS на сервер
Добрый день! Получил задачу (в универе) создать GPS трекер который отправляет координаты на сервер. На сервере они отображаются на карте....

Отправить данные из TextView на сервер
Как отправить данные с TextView и других текстовых view на сервер по нажатию на кнопку?

Как отправить данные на сервер?
Есть форма, на ней таблица, вот такая примерно: &lt;table id=&quot;IngredientTable&quot; runat = &quot;server&quot;&gt;... и т.д. У этой таблицы первоначально...

Отправить данные на сервер позже
Здравствуйте, хочу написать клиент серверное приложение но с поддержкой &quot;позже отправлять данные на сервер&quot;, когда есть...

Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст
Ребят подскажите как сделать: Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст(1 строка). Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru