powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с протоколом HTTP в C++
5 сообщений из 5, страница 1 из 1
Работа с протоколом HTTP в C++
    #38335592
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Я написал проект взаимодействия клиентской программы с серверами (web-сервер и вычислительный сервер). Ядро проекта заключается в этих самых серверах, но есть клиентская программа, устанавливаемая на компьютере клиента, которая производит инициализацию начальных данных, и в нее же возвращаются результаты с серверов.
Сложность в том, что я "заглушку" клиентской программы написал на Delphi (я дельфист), где взаимодействие по HTTP протоколу осуществляется с помощью библиотеки Synapse, а клиентская программа у заказчика написана на C++.

Не поможете ли найти аналогичное решение для C++ для HTTP взаимодействия?
Вот несколько исходников на дельфи:

Фрагмент авторизации:
Код: plaintext
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.
function TfmMain.Authorize1: integer;
var
  HTTP: THTTPSend;
  Stream: TStream;
  URLData: AnsiString;
  len: integer;
begin
  Result := 0;
  HTTP := THTTPSend.Create;
  Stream := TStream.Create;
  try                  
    HTTP.MimeType := 'application/x-www-form-urlencoded';
    URLData := 'login=' + EditLogin.Text + '&phase=try';
    Len := Length(URLData);
    HTTP.Document.Write(Pointer(URLData)^, Len);
    if HTTP.HTTPMethod('POST', URLAuthorize) then
        MemoAuthorize.Lines.LoadFromStream(HTTP.Document);
        if MemoAuthorize.Text[1] <> '-' then
          EditChallenge.Text := MemoAuthorize.Text
        else
          Result := StrToInt(MemoAuthorize.Text);
  finally
    Stream.Free;
    HTTP.Free;
  end;



Отправка файла:
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
procedure TfmMain.btnSendFileClick(Sender: TObject);
const
  CRLF = #$0D + #$0A;
var
  HTTP: THTTPSend;
  Bound, s: AnsiString;
  stream: TFileStream;
  ResultData: TStrings;
  CRC: AnsiString;
begin
  MemoUploadSourceFile.Clear;
  if EditFilename.Text = '' then
    begin
      LabelUploadSourceFile.Caption := 'Ошибка: Не выбран файл для выгрузки!';
      exit;
    end;
  Bound := IntToHex(Random(MaxInt), 8) + '_boundary';
  HTTP := THTTPSend.Create;
  try
    HTTP.MimeType := 'multipart/form-data, boundary=' + Bound;

    // Дескриптор операции
    s := '--' + Bound + CRLF;
    s := s + 'content-disposition: form-data; name="descriptor";' + CRLF + CRLF;
    s := s + descriptor + CRLF;
    HTTP.Document.Write(Pointer(s)^, Length(s));

    // Номер транзакции
    s := '--' + Bound + CRLF;
    s := s + 'content-disposition: form-data; name="transaction_number";' + CRLF + CRLF;
    s := s + TransactionNumber + CRLF;
    HTTP.Document.Write(Pointer(s)^, Length(s));

    // Контрольная сумма
    CRC := IntToStr(FileCRC32(EditFilename.Text));
    s := '--' + Bound + CRLF;
    s := s + 'content-disposition: form-data; name="crc";' + CRLF + CRLF;
    s := s + CRC + CRLF;
    HTTP.Document.Write(Pointer(s)^, Length(s));

    // Содержимое файла
    s := '--' + Bound + CRLF;
    s := s + 'content-disposition: form-data; name="source_file";';
    s := s + ' filename="' + ExtractFilename(EditFilename.Text) +'"' + CRLF;
    s := s + 'Content-Type: Application/octet-stream' + CRLF + CRLF;
    HTTP.Document.Write(Pointer(s)^, Length(s));

    stream := TFileStream.Create(EditFilename.Text, fmOpenRead or fmShareDenyWrite);
    HTTP.Document.CopyFrom(stream, 0);
    stream.Free;

    s := CRLF + '--' + Bound + '--' + CRLF;
    HTTP.Document.Write(Pointer(s)^, Length(s));

    if HTTP.HTTPMethod('POST', URLUploadSourceFile) then
      begin
        ResultData := TStringList(MemoUploadSourceFile.Lines);
        ResultData.LoadFromStream(HTTP.Document);

        if MemoUploadSourceFile.Lines[0] = '0' then
          LabelUploadSourceFile.Caption := 'Выгрузка успешна!'
        else
        if MemoUploadSourceFile.Text = '-1' then
          LabelUploadSourceFile.Caption := 'Ошибка: Не указан дескриптор!'
        else
        if MemoUploadSourceFile.Text = '-2' then
          LabelUploadSourceFile.Caption := 'Ошибка: Не указан номер транзакции!'
        else
        if MemoUploadSourceFile.Text = '-3' then
          LabelUploadSourceFile.Caption := 'Ошибка: Не указана контрольная сумма файла!'
        else
        if MemoUploadSourceFile.Text = '-4' then
          LabelUploadSourceFile.Caption := 'Ошибка: Пользователь не авторизован!';
      end
    else
      ShowMessage('Не удалось скопировать файл');
  finally
    HTTP.Free;
  end;
end;



Получение файла:
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
procedure TfmMain.btnGetResultFileClick(Sender: TObject);
var
  HTTP: THTTPSend;
  Stream: TStringStream;
  FStream: TFileStream;
  URLData: AnsiString;
  len: integer;
  fio: string;
  i: Integer;
  checksum: string;
  ResultFileName: string;
  ResultCode: string; // результат 0 - удачно, отрицательное значение - ошибка
  ProgramFolder: string;
begin
  HTTP := THTTPSend.Create;
  Stream := TStringStream.Create('', TEncoding.UTF8);
  try
    HTTP.MimeType := 'application/x-www-form-urlencoded';
    URLData := 'descriptor=' + descriptor +
               '&transaction_number=' + TransactionNumber;
    Len := Length(URLData);
    HTTP.Document.Write(Pointer(URLData)^, Len);
    if HTTP.HTTPMethod('POST', URLGetResultFile) then
      begin
        ....
        if ResultCode = '0' then // удачное получение файла
          begin
            Stream.LoadFromStream(HTTP.Document);
            Stream.SaveToFile(ProgramFolder + 'out\' + ResultFileName);

            if checksum = IntToStr(FileCRC32(ProgramFolder + 'out\' + ResultFileName)) then
              LabelGetResultFile.Caption := 'Скачивание файла результата успешно!'
            else
              LabelGetResultFile.Caption := 'CRC не совпадает! Возможно, файл поврежден при передаче.'
          end
        else
        if ResultCode = '-1' then
          LabelGetResultFile.Caption := 'Ошибка: Не указан дескриптор!'
        else
        if ResultCode = '-2' then
          LabelGetResultFile.Caption := 'Ошибка: Не указан номер транзакции!'
        else
        if ResultCode = '-3' then
          LabelGetResultFile.Caption := 'Ошибка: Пользователь не авторизован!'
       ...
 
  finally
    Stream.Free;
    HTTP.Free;
  end;
end;
...
Рейтинг: 0 / 0
Работа с протоколом HTTP в C++
    #38335617
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladя дельфист
Если бы ты не полагался на готовые компоненты, а использовал WinInet или сокеты напрямую,
такой проблемы не возникло бы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с протоколом HTTP в C++
    #38335692
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНе поможете ли найти аналогичное решение для C++ для HTTP взаимодействия?

libwget я уверен есть.
libcurl тоже.
...
Рейтинг: 0 / 0
Работа с протоколом HTTP в C++
    #38336306
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovsvnvladя дельфист
Если бы ты не полагался на готовые компоненты, а использовал WinInet или сокеты напрямую,
такой проблемы не возникло бы.

Synapse разве WinInet использует?
...
Рейтинг: 0 / 0
Работа с протоколом HTTP в C++
    #38339205
sterewert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad,

Я на Qt переписал. Тоже мигрировали с Delphi, где использовали Synapse.

Простой пример тут

YouTube Video
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с протоколом HTTP в C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]