C ++ кроссплатформенный сокет с HTTP-запросом - PullRequest
0 голосов
/ 27 июня 2018

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

Github: Разъем c ++ кроссплатформенный

Проблема возникает, когда я пытался сделать http GET-запрос Когда я пытаюсь выполнить простые запросы, он возвращает мне правильное значение, но при выполнении этого сложного запроса:

"GET /1.0/stock/aapl/batch?types=quote,news,chart&range=1m&last=10 HTTP / 1.0 \ r \ nHost: api.iextrading.com \ r \ nСоединение: закрыть \ r \ п \ г \ п "

Ничего не возвращает!

// main.cpp

#include <string>
#include <ActiveSocket.h>

#define SEND(a,b,c,d)          send(a, (const char *)b, (int)c, d)
typedef unsigned char  uint8;

int main(int argc, char **argv)
{
    CActiveSocket socket;       // Instantiate active socket object (defaults to TCP).
    char          time[50];
    memset(&time, 0, 50);
    char host[] = "api.iextrading.com";
    char message[] = "GET /1.0/stock/aapl/batch?types=quote,news,chart&range=1m&last=10 HTTP/1.0\r\nHost: api.iextrading.com\r\nConnection: close\r\n\r\n";


    socket.Initialize();

    if (socket.Open(host, 80))
    {

        if (socket.Send((const uint8 *)message, strlen(message)))
        {
            socket.Receive(4096);//size of the buffer

            socket.Close();
        }
    }

    getchar();
    return 1;
}

// CActiveSocket.h

int32 CSimpleSocket::Send(const uint8 *pBuf, size_t bytesToSend)
{
    SetSocketError(SocketSuccess);
    m_nBytesSent = 0;

    switch(m_nSocketType)
    {
    case CSimpleSocket::SocketTypeTcp:
    {
        if (IsSocketValid())
        {
            if ((bytesToSend > 0) && (pBuf != NULL))
            {
                m_timer.Initialize();
                m_timer.SetStartTime();

                //---------------------------------------------------------
                // Check error condition and attempt to resend if call
                // was interrupted by a signal.
                //---------------------------------------------------------
                do
                {
                    m_nBytesSent = SEND(m_socket, pBuf, bytesToSend, 0);
                    TranslateSocketError();
                } while (GetSocketError() == CSimpleSocket::SocketInterrupted);

                m_timer.SetEndTime();
            }
        }
        break;
    }
...
}


int32 CSimpleSocket::Receive(int32 nMaxBytes, uint8 * pBuffer )
{
    m_nBytesReceived = 0;

    if (IsSocketValid() == false)
    {
        return m_nBytesReceived;
    }

    uint8 * pWorkBuffer = pBuffer;
    if ( pBuffer == NULL )
    {
        if ((m_pBuffer != NULL) && (nMaxBytes != m_nBufferSize))
        {
            delete [] m_pBuffer;
            m_pBuffer = NULL;
        }
        if (m_pBuffer == NULL)
        {
            m_nBufferSize = nMaxBytes;
            m_pBuffer = new uint8[nMaxBytes];
        }
        pWorkBuffer = m_pBuffer;
    }

    SetSocketError(SocketSuccess);

    m_timer.Initialize();
    m_timer.SetStartTime();

    switch (m_nSocketType)
    {
    case CSimpleSocket::SocketTypeTcp:
    {
        do
        {
            m_nBytesReceived = RECV(m_socket, (pWorkBuffer +m_nBytesReceived), nMaxBytes, m_nFlags);
            TranslateSocketError();
        } while ((GetSocketError() == CSimpleSocket::SocketInterrupted));

        break;
    }
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...