Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2014, 15:28   #1
rafaelka
Пользователь
 
Регистрация: 10.06.2014
Сообщений: 18
По умолчанию Delphi - HttpS протокол (ssl + winsock ) delphi

Собственно сабж,как реализовать обмен данных через ssl(openssl например, но если есть более лёгкие(вес) и стабильные библиотеки, то это гораздо лучше)(интересует get/post) запросы...
Пробовал воспользоваться библиотекой от SLESH'а, но возникают проблемы, либо вообще не создается сокет(но это вроде решил, проблема была в типах), теперь не передает буфер модулю... Тоже грешил на типы, но вроде приводил к требуемому pchar, результат фриз формы...

https://forum.antichat.ru/showthread.php?t=145550 (Модуль)


На этом этапе фризит

Код:
ss.Send((PChar(buf)), length(buf));
rafaelka вне форума Ответить с цитированием
Старый 10.12.2014, 15:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я так понял INDI не годится?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2014, 16:19   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Делфи юникодная не так ли?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.12.2014, 16:48   #4
rafaelka
Пользователь
 
Регистрация: 10.06.2014
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Делфи юникодная не так ли?
Да всё так)

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я так понял INDI не годится?
Не не канает, хочу сокеты разобрать, да и инди сильно большая либа..)

Последний раз редактировалось Stilet; 10.12.2014 в 20:07.
rafaelka вне форума Ответить с цитированием
Старый 10.12.2014, 16:57   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

PChar замените на PAnsiChar должно заработать будет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.12.2014, 17:02   #6
rafaelka
Пользователь
 
Регистрация: 10.06.2014
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
PChar замените на PAnsiChar должно заработать будет.
Не работает по причине того, что
Код:
function TSLESH_SSL_Socket.Send(buf:pchar; len:integer):integer;
begin
  if Connected then
    result := SSL_write(ssl, buf, len)
  else
    result := 0;
end;
Это функция, грубо говоря если поменять еще и тут pchar на pansichar то будет ошибка в вызове фунции из библиотеки (SSL_write)
rafaelka вне форума Ответить с цитированием
Старый 10.12.2014, 17:19   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну и в объявлении SSL_write и тп тоже замените.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.12.2014, 17:39   #8
rafaelka
Пользователь
 
Регистрация: 10.06.2014
Сообщений: 18
По умолчанию

Текущий код модуля:
Код:
unit SSLSocket;

interface
uses winsock,System.SysUtils;

type
TSLESH_SSL_Socket = class
  function Connect(ip:string; port:word):boolean;
  function Send(buf:pansichar; len:integer):integer;
  function Recv(buf:pansichar; len:integer):integer;
  procedure Close;
  constructor Create(InitWinSock:boolean);
  destructor Destroy; override;

 private
  ws:WSAData;
  method:pointer;
  ctx:pointer;
  ssl:pointer;
  caddr:sockaddr_in;
 public
  sock: Tsocket; // сокет. если нужен для какихто других операций
  ErrorFlag:boolean; // если TRUE значит произошла ошибка при создании
  Connected:boolean; // если TRUE значит есть коннект
end;


implementation
 const SSL_LIB_NAME = 'ssleay32.dll';

function SSL_library_init:Integer; cdecl; external SSL_LIB_NAME;
function SSLv2_client_method:Pointer; cdecl; external SSL_LIB_NAME;
function SSL_CTX_new(meth: Pointer):Pointer; cdecl; external SSL_LIB_NAME;
function SSL_new(ctx: Pointer):Pointer; cdecl; external SSL_LIB_NAME;
function SSL_set_fd(s: pointer; fd: tsocket):Integer cdecl; external SSL_LIB_NAME;
function SSL_connect(ssl: pointer):Integer; cdecl; external SSL_LIB_NAME;
procedure SSL_free(ssl: pointer); cdecl; external SSL_LIB_NAME;
function SSL_read(ssl: pointer; buf: PansiChar; num: Integer):Integer; cdecl; external SSL_LIB_NAME;
function SSL_write(ssl: pointer; buf: PansiChar; num: Integer):Integer; cdecl; external SSL_LIB_NAME;

// Посылка данных. Указываются:
// адрес буфера и длинна посылаемых данных
function TSLESH_SSL_Socket.Send(buf:pansichar; len:integer):integer;
begin
  if Connected then
    result := SSL_write(ssl, buf, len)
  else
    result := 0;
end;

// Прием данных. Указываются:
// адрес буфера и размер буфера
function TSLESH_SSL_Socket.Recv(buf:pansichar; len:integer):integer;
begin
  if Connected then
    result := SSL_read(ssl, buf, len)
  else
    result := 0;
end;

// закрытие соединения
procedure TSLESH_SSL_Socket.Close;
begin
  if sock <> INVALID_SOCKET then
  begin
    closesocket(sock);
    sock := INVALID_SOCKET;
  end;

  Connected := false;
end;

// коннект к серваку.Указываются:
// ip адрес или доменное имя
// порт куда коннектится. обычно 443
function TSLESH_SSL_Socket.Connect(ip:string; port:word):boolean;
var
  nip:integer;
  phe:PHostEnt;
 // sq:string;
begin
  result := false;
  sock := socket(AF_INET, SOCK_STREAM, 0);
  ErrorFlag := sock = INVALID_SOCKET;
  // если сокет создался
  if (ErrorFlag = false) then
  begin
      caddr.sin_family := AF_INET;
      caddr.sin_addr.s_addr := inet_addr(PAnsiChar(AnsiString(ip)));
      caddr.sin_port := htons(port);
      // коннектитмся
      if winsock.connect(sock, caddr, sizeof(caddr)) <> -1 then
      begin
        // если сконнектились то настраиваем SSL
        SSL_set_fd(ssl, sock);
        SSL_connect(ssl);
        result := true;
      end;
    end;
    Connected := result;
end;


// конструктор класса
// если  InitWinSock = true то попутно инициализируем winsock
constructor TSLESH_SSL_Socket.Create(InitWinSock:boolean);
begin
  ErrorFlag := true;
  Connected := false;
  if InitWinSock then
  begin
    // инициализируем winsock
    WSAStartUp($101, ws);
  end;

  // инициализируем SSL либу
  SSL_library_init();
  method := SSLv2_client_method();
  if method <> nil then
  begin
    // создаем контексты для использования SSL
    ctx := SSL_CTX_new(method);
    if ctx <> nil then
    begin
      ssl := SSL_new(ctx);
      if ssl <> nil then
      begin
        ErrorFlag := false;
      end;
    end;
  end;
end;

// деструктор
destructor TSLESH_SSL_Socket.Destroy;
begin
  Close; // закроем сокет
  if ssl <> nil then SSL_free(ssl); // закроем либу
end;

end.
Текущий вызов модуля:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  buf : ansistring;      buf1: array[1..5000] of ansiChar;
  len : integer;
  ss:TSLESH_SSL_Socket;
  tmp : array[0..5000] of ansichar; // временный буфер
begin
  ss := TSLESH_SSL_Socket.Create(true); // создаем наш класс
  if not ss.ErrorFlag then // если нет ошибки то продолжаем
  begin
    if ss.Connect('87.240.131.120', 443) then // если смогли сконнектится
    begin
      // наш HTTP запрос
      buf := 'GET / HTTP/1.0'#13#10'Host: vk.com'#13#10#13#10;
      // посылаем запрос
      CopyMemory(@buf1, PChar(buf), Length(buf));
      //ss.send(PansiChar(buf),SizeOf(buf));
      ss.send(@buf1[1], Length(buf1) * SizeOf(Char));
      //ss.Send(PChar(@buf1[1]), SizeOf(buf1));
      ShowMessage('sadsa');
      buf := '';


      // читаем пришедшие данных
      repeat
        len := ss.Recv(tmp, 1024);
        if len > 0 then buf := buf + copy(tmp, 0, len);
      until len <= 0;
      ss.Close; // закрываем соединение
      // выводим данные в первый мемо
      Memo1.Lines.Text := buf;
    end;
    ss.Destroy; // завершаем работу
  end;
end;


Вообщем фриз до сих пор при вызове, пытался понять где фризит, в итоге именно при вызове ss.send ((
rafaelka вне форума Ответить с цитированием
Старый 11.12.2014, 00:48   #9
rafaelka
Пользователь
 
Регистрация: 10.06.2014
Сообщений: 18
По умолчанию

Вообщем фриз до сих пор при вызове, пытался понять где фризит, в итоге именно при вызове ss.send (([/QUOTE]
Если кто может привести это дело к работоспособному виду, то я буду очень раз. отблагодарю так же финансово
rafaelka вне форума Ответить с цитированием
Старый 11.12.2014, 07:57   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Запихни все это дело в поток, тогда замораживаться не будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
INDY + HTTPS + SSL Maxwellion Работа с сетью в Delphi 5 16.01.2014 16:45
Снифер httpS (ssl) lollollollol Работа с сетью в Delphi 6 09.09.2013 19:44
Загвоздка с httpS и SSL bakanaev Общие вопросы Delphi 6 09.08.2013 18:41
И снова сертификаты, или ssl+delphi+https Lothar Работа с сетью в Delphi 4 04.05.2011 08:23
Delphi 7 + .NET web services + SSL(https) dreadangel Работа с сетью в Delphi 2 28.04.2009 15:10