Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.140.111] |
|
Сообщ.
#1
,
|
|
|
Программа отлично отправляет запросы на http. Однако на https - никак не получается.
// Посылает запрос 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; } |
Сообщ.
#2
,
|
|
|
Попробуй поковырять исходники QT, там есть класс QHttp, который умеет HTTPS.
|
Сообщ.
#3
,
|
|
|
Цитата trofim24 @ // Если вставить вот это, то работать перестает Работать перестает - это не диагностика. Это - пост-фактум. Где не работает, какая функция, код ошибки И потом - вы не забыли HTTPS-порт - 443? |
Сообщ.
#4
,
|
|
|
С https всё гораздо сложнее. Тут самый постой путь использовать openssl, благо примеров нагуглить можно много. А более сложный - реализовывать протокол SSL/TLS самому с помощью CryptoAPI. Это протокол уровнем ниже как бы чем http, так что посылка запроса http на прямую не катит.
|
Сообщ.
#5
,
|
|
|
Ссори, что так долго не отвечал, дела были.
Цитата Oleg2004 Цитата trofim24 @ // Если вставить вот это, то работать перестает Работать перестает - это не диагностика. Это - пост-фактум. Где не работает, какая функция, код ошибки И потом - вы не забыли HTTPS-порт - 443? Описка, там реально HTTPS. Ошибку выдает GetLastError = 10054. Но суть не в этом, если трассирую запрос, то он обращается к http, а не к https. Вот в этом похоже и кроется проблема. |
Сообщ.
#6
,
|
|
|
https - это защищённый протокол, и просто поменять порт будет мало. Т.к. данные передаются в зашифрованном видео, это ничего не даст. Необходимо расшифровать. Легче всего использовать OpenSSL. Тут есть статья Https c помощью OpenSSL. В ней есть пример должен помочь.
|