На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > POST запрос на HTTPS , POST запрос на HTTPS
      Программа отлично отправляет запросы на http. Однако на https - никак не получается.
      ExpandedWrap disabled
        // Посылает запрос
        HRESULT CSocket::SendRequest ( LPCTSTR lpszType, LPCTSTR lpszHostName,LPCTSTR lpszData)
        {
            m_sRequestResult = "";
         
            WORD    wVersionRequested = MAKEWORD( 1, 1 );
            WSADATA WSAData;
            INT     nError;
         
            nError = WSAStartup ( wVersionRequested, &WSAData );
            if ( NO_ERROR != nError )
            {
                return ERROR_MEMORY;
            }
            SOCKET oConnectSocket = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP );
            if ( INVALID_SOCKET == oConnectSocket )
            {
                WSACleanup ();
                return ERROR_CONNECTION;
            }
         
            PHOSTENT pHostent = gethostbyname ( lpszHostName );
            if ( NULL == pHostent )
            {
                closesocket ( oConnectSocket );
                WSACleanup ();
                return ERROR_CONNECTION;
            }
         
            SOCKADDR_IN oRemoteAddr = { 0 };
            oRemoteAddr.sin_family = AF_INET;
            oRemoteAddr.sin_port = htons ( INTERNET_DEFAULT_HTTP_PORT );
         
                // Если вставить вот это, то работать перестает
            if ( FALSE )
            {
                oRemoteAddr.sin_port = htons ( INTERNET_DEFAULT_HTTP_PORT );
                m_sHTTPVersion = "HTTP/1.1";
                m_sConnection = "Connection: Keep-Alive\r\nExpect: 100-continue";
            }
         
            memcpy ( ( PCHAR ) &( oRemoteAddr.sin_addr ), pHostent->h_addr, pHostent->h_length );
         
            if ( SOCKET_ERROR == connect ( oConnectSocket, ( PSOCKADDR ) &oRemoteAddr, sizeof ( oRemoteAddr ) ) )
            {
                closesocket ( oConnectSocket );
                WSACleanup ();
                return ERROR_CONNECTION;
            }
         
            CString sContentData = "";
            if ( NULL != lpszData )
            {
                        sContentData = lpszData;
            }
         
            LONGLONG nContentSize = sContentData.GetLength ();
         
            CString sSendBuffer = "";
         
            sSendBuffer += lpszType;
            sSendBuffer += " ";
            sSendBuffer += lpszAction;
            sSendBuffer += " " + m_sHTTPVersion + g_cpszXmlFileSpacer;
         
            sSendBuffer += m_sAccept + g_cpszXmlFileSpacer;
            sSendBuffer += "Host: "; sSendBuffer += lpszHostName; sSendBuffer += g_cpszXmlFileSpacer;
            sSendBuffer += m_sUserAgent + g_cpszXmlFileSpacer;
            if ( NULL != lpszHeaders && "" != lpszHeaders )
            {
                sSendBuffer += lpszHeaders; sSendBuffer += g_cpszXmlFileSpacer;
            }
            if ( 0 != nContentSize )
            {
                CString sContentLength = ""; sContentLength.Format ( "%I64d", nContentSize );
                sSendBuffer += "Content-Length: " + sContentLength + g_cpszXmlFileSpacer;
            }
            sSendBuffer += m_sContentType + g_cpszXmlFileSpacer;
            sSendBuffer += m_sConnection + g_cpszXmlFileSpacer;
            sSendBuffer += g_cpszXmlFileSpacer;
         
            // Посылаем запрос
            nError = send ( oConnectSocket, sSendBuffer, sSendBuffer.GetLength (), 0 );
            if ( SOCKET_ERROR == nError )
            {
                closesocket ( oConnectSocket );
                WSACleanup ();
                return ERROR_CONNECTION;
            }
         
            if ( 0 != nContentSize && "" != sContentData )
            {
                nError = send ( oConnectSocket, sContentData, sContentData.GetLength (), 0 );
                if ( SOCKET_ERROR == nError )
                {
                    closesocket ( oConnectSocket );
                    WSACleanup ();
                    return ERROR_CONNECTION;
                }
            }
         
            const INT cnSizeRecv = 1024;
            CHAR szLine [ cnSizeRecv ] = { 0 };
         
            LONGLONG nContentLengthRecv = 0;
         
            do
            {
                nError = recv ( oConnectSocket, szLine, cnSizeRecv, 0 );
                if ( 0 < nError )
                {
                    m_sRequestResult.Append ( szLine, nError );
                }
                else
                {
                    break;
                }
            }
            while ( TRUE );
         
            if ( 0 > nError )
            {
                closesocket ( oConnectSocket );
                WSACleanup ();
                return ERROR_CONNECTION;
            }
         
            closesocket ( oConnectSocket );
            WSACleanup ();
         
            return NO_ERROR;
        }
        Попробуй поковырять исходники QT, там есть класс QHttp, который умеет HTTPS.
          Цитата trofim24 @
          // Если вставить вот это, то работать перестает

          Работать перестает - это не диагностика.
          Это - пост-фактум.
          Где не работает, какая функция, код ошибки
          И потом - вы не забыли HTTPS-порт - 443?
            С https всё гораздо сложнее. Тут самый постой путь использовать openssl, благо примеров нагуглить можно много. А более сложный - реализовывать протокол SSL/TLS самому с помощью CryptoAPI. Это протокол уровнем ниже как бы чем http, так что посылка запроса http на прямую не катит.
            Сообщение отредактировано: Jenya -
              Ссори, что так долго не отвечал, дела были.

              Цитата Oleg2004
              Цитата trofim24 @
              // Если вставить вот это, то работать перестает

              Работать перестает - это не диагностика.
              Это - пост-фактум.
              Где не работает, какая функция, код ошибки
              И потом - вы не забыли HTTPS-порт - 443?


              Описка, там реально HTTPS. Ошибку выдает GetLastError = 10054.
              Но суть не в этом, если трассирую запрос, то он обращается к http, а не к https. Вот в этом похоже и кроется проблема.
                https - это защищённый протокол, и просто поменять порт будет мало. Т.к. данные передаются в зашифрованном видео, это ничего не даст. Необходимо расшифровать. Легче всего использовать OpenSSL. Тут есть статья Https c помощью OpenSSL. В ней есть пример должен помочь.
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0230 ]   [ 15 queries used ]   [ Generated: 18.05.24, 23:54 GMT ]