yejiKim
yejiKim

Reputation: 31

How can I get a response from an HTTP server in MFC?

I am a student who studying MFC. I want to get a response from an HTTP server socket programming in MFC. But I can not solve this problem.

My code is:

SOCKET m_client_socket;
WSADATA wsadata;
struct sockaddr_in server_addr;
char *http_Request;
char *http_recv_data;
int recv_len;

if (!WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata))
{
    if (wsadata.wVersion < MINIMUM_WINSOCK_VERSION)
    {
        WSACleanup();
        return;
    }
}

// Create socket
m_client_socket = socket(PF_INET, SOCK_STREAM, 0);
if (m_client_socket == INVALID_SOCKET)
{
    AfxMessageBox("socket error : ");
    WSACleanup();
    return;
}

// Set value
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("www.example.com");
server_addr.sin_port = htons(80);

// Connect
if (connect(m_client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR)
{
    AfxMessageBox("connect error : ");
    closesocket(m_client_socket);
    return;
}

// send(m_client_socket, http_Request, strlen(http_Request), 0);
recv_len = recv(m_client_socket, http_recv_data, BUFSIZE, 0);
http_recv_data[recv_len] = '\0';

MessageBox(http_recv_data, "Return Value", NULL);

// Close
closesocket(m_client_socket);
WSACleanup();

There are no errors but I received NULL. Help me sir!

Upvotes: 1

Views: 3797

Answers (1)

Andrew Komiagin
Andrew Komiagin

Reputation: 6566

MFC implements Internet sessions as objects of class CInternetSession. Using this class, you can create one Internet session or several simultaneous sessions.

Here is an example:

#include <AfxInet.h>
CInternetSession session;

CHttpFile *pHttpFile = NULL;
try
{
    pHttpFile = (CHttpFile *)session.OpenURL(_T("http://www.google.com"));
}
catch (CInternetException)
{
    // Handle exception
}
if(pHttpFile != NULL)
{
    CByteArray data;
    data.SetSize(1024);
    int nBytesRead = pFile->Read(data.GetData(), data.GetSize());
}

You can also go down to bare bones:

CInternetSession session; 
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
CString szHeaders( _T("Content-Type: application/x-www-form-urlencoded;Accept: text/xml, text/plain, text/html, text/htm\r\nHost: www.mydomain.com\r\n\r\n"));
CString strObject; 

DWORD dwRet;

CByteArray dataBuf;
dataBuf.SetSize(1024);

try
{

   INTERNET_PORT nPort(80);

   pServer = session.GetHttpConnection(_T("www.mydomain.com"), nPort);
   pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
   pFile->AddRequestHeaders(szHeaders);
   pFile->SendRequest();
   pFile->QueryInfoStatusCode(dwRet);

   if (dwRet == HTTP_STATUS_OK)
   {
       UINT nRead = pFile->Read(dataBuf.GetData(), dataBuf.GetSize());
   }
   delete pFile;
   delete pServer;
}
catch (CInternetException* pEx)
{
   TCHAR sz[1024];
   pEx->GetErrorMessage(sz, 1024);
   pEx->Delete();
}

Upvotes: 4

Related Questions