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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2014, 16:22   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Скорее всего они через какое-то время закроются эти соединения.
ПОнаблюдайте и замерьте время.
waleri вне форума Ответить с цитированием
Старый 30.04.2014, 22:52   #12
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

я также думал, но 2 часа висят и не закрываются точно.

Понаблюдал внимательней, заметил что этот глюк касается только ssl подключений, которые создаютс так:

Код:
function TSLESH_SSL_Socket.Connect(ip:String; port:word):boolean;
var
  nip:integer;
  phe:PHostEnt;
  SendBuff: String;
  buff: array[1..512] of char;
  D1,D2:Byte;
  D3:word;
  TimeOutSSS:integer;
begin
  TimeOutSSS:=20000;
  result := false;
  sock := socket(AF_INET, SOCK_STREAM, 0);
  ErrorFlag := sock = INVALID_SOCKET;
  // если сокет создался
  if (ErrorFlag = false) then begin
    if (ProxyType=0) then begin
      nip := inet_addr(PAnsichar(ip));
      if nip = INADDR_NONE then begin
        // резолвим имя
        phe := gethostbyname(PAnsichar(ip));
        if phe <> nil then begin
          nip := integer(pointer(phe^.h_addr^)^);
        end;
      end;

      if nip <> INADDR_NONE then begin
        caddr.sin_family := AF_INET;
        caddr.sin_addr.s_addr := nip;
        caddr.sin_port := htons(port);

        // коннектитмся
        if winsock.connect(sock, caddr, sizeof(caddr)) <> SOCKET_ERROR then begin
          SetSockOpt(sock, SOL_SOCKET, SO_RCVTIMEO, @TimeOutSSS, SizeOf(TimeOutSSS));
          // если сконнектились то настраиваем SSL
          SSL_set_fd(ssl, sock);
          SSL_connect(ssl);
          result := true;
        end;
      end;
    end else begin
      //Коннектимся к прокси
      if (ProxyType>=2) then begin
        caddr.sin_family := AF_INET;
        caddr.sin_addr.s_addr := ProxyServer;
        caddr.sin_port := ProxyPort;
        if winsock.connect(sock, caddr, sizeof(caddr)) <> SOCKET_ERROR then begin
          SetSockOpt(sock, SOL_SOCKET, SO_RCVTIMEO, @TimeOutSSS, SizeOf(TimeOutSSS));
          SendBuff:=#5#1#0;
          winsock.send(sock, SendBuff[1], 3, 0);
          winsock.recv(sock, buff, 2, 0);
          if (buff[1] <> #5) then begin
            result:=False;
            Connected := result;
            winsock.CloseSocket(sock);
            exit;
          end;
          D3:=htons(port);
          asm
            mov ax, D3
            mov D1, al
            mov D2, ah
          end;
          SendBuff:=#5#1#0#3+chr(length(ip))+ip+chr(D1)+chr(D2);
          winsock.send(sock, SendBuff[1], Length(SendBuff), 0);
          winsock.recv(sock, buff, SizeOf(Buff), 0);
          if ((buff[1]=#5)and(buff[2]=#0)) then result:=true else result:=False;
          if (result=True) then begin
            SSL_set_fd(ssl, sock);
            SSL_connect(ssl);
          end else begin
            winsock.CloseSocket(sock);
          end;
        end;
      end;
    end;
  end;
  Connected := result;
end;
А разрываются как я показал в первом посте. Точнее сказать разрываются не все.
Примечательно, что данные отправляются/принимаются в полном объёме.


Теоретический вопрос, может ли висеть поделючение, если удалённый сервер разорвал его, т.е. выполнил closesocket?
lollollollol вне форума Ответить с цитированием
Старый 30.04.2014, 23:21   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
может ли висеть поделючение, если удалённый сервер разорвал его, т.е. выполнил closesocket?
Не должно висеть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2014, 09:22   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я не разбираюсь в OpenSLL библиотеке, но если есть SSL_connect то что-то подсказывает, что должна быть и обратная функция, разве нет?

Кстати, а если отключить Firewall результат тот же?
waleri вне форума Ответить с цитированием
Старый 02.05.2014, 16:41   #15
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

вот все ссл функции из ssleay32.dll

Код:
      @SSL_library_init := GetProcAddress(h, 'SSL_library_init');
      @SSLv3_client_method := GetProcAddress(h, 'SSLv3_client_method');
      @SSL_CTX_new := GetProcAddress(h, 'SSL_CTX_new');
      @SSL_set_fd := GetProcAddress(h, 'SSL_set_fd');
      @SSL_connect := GetProcAddress(h, 'SSL_connect');
      @SSL_free := GetProcAddress(h, 'SSL_free');
      @SSL_read := GetProcAddress(h, 'SSL_read');
      @SSL_write := GetProcAddress(h, 'SSL_write');
      @SSL_new := GetProcAddress(h, 'SSL_new');
Цитата:
Я не разбираюсь в OpenSLL библиотеке, но если есть SSL_connect то что-то подсказывает, что должна быть и обратная функция, разве нет?
Не совсем, по идеи это SSL_free, и оно высвобождает ресурсы ssl, уже после разрыва соединения.
Смысл ссл в том, что я создаю подключение обычным способом, привязываю это сокетное подключение к инициализированному ssl контексту, выполняю обычным методом подключение к удалённому серверу, а SSL_connect выполняет настройку подключений для передачи данных, в соответствии с ssl протоколом.

При завершении работы с ssl подключением нужно вызвать SSL_free. Так как она просто освободит занятую память ssl, это нужно вызвать уже после работы с сокетом, т.е. даже после закрытия его, я это делаю.

Последний раз редактировалось lollollollol; 02.05.2014 в 16:47.
lollollollol вне форума Ответить с цитированием
Старый 02.05.2014, 16:42   #16
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

фаервол точно не виноват, иначе висели бы все, а не часть
lollollollol вне форума Ответить с цитированием
Старый 02.05.2014, 21:13   #17
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Вообщем сам не понял суть проблемы. Сделал вызов функции закрытий подключений 3 раза подряд с таймаутами, стало закрываться всё как положено.

Думаю тему можно закрыть.

Последний раз редактировалось lollollollol; 03.05.2014 в 00:43.
lollollollol вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разорвать adsl соединение megostudent Работа с сетью в Delphi 5 28.03.2012 16:43
не могу сделать правильный пост запрос на winsock cable Работа с сетью в Delphi 0 10.07.2010 18:01
Разорвать Dial-Up соединение Михаил Юрьевич Работа с сетью в Delphi 0 19.12.2009 12:43
Как обработать не валидный коннект?(delphi,winsock) zotox Работа с сетью в Delphi 1 02.08.2009 19:46
Как разорвать связи? valerij Microsoft Office Excel 5 18.05.2009 23:36