如何从MFC中的HTTP服务器获取响应?

问题描述:

我是一名学习MFC的学生。 我想从MFC中的HTTP服务器套接字编程中获得响应。 但我无法解决这个问题。如何从MFC中的HTTP服务器获取响应?

我的代码是:

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(); 

有没有错误,但我收到NULL。帮我先生!

+0

'8.8.8.8'是谷歌的公共DNS服务器。你为什么期望在那里找到一个Web服务器?你可以尝试'example.com',但不要殴打不受你控制的服务器。 –

+0

您需要发送HTTP请求,然后服务器才会响应HTTP响应。为什么服务器在你连接后才开始发送数据? –

MFC实现Internet会话作为类CInternetSession的对象。使用此课程,您可以创建一个Internet会话或几个同时进行的会话。

下面是一个例子:

#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()); 
} 

你也可以去到光秃秃的骨头:

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(); 
} 
+0

对不起,我可以看到“错误C2065:'params':未声明的标识符”,所以我纠正它是这样的:pFile-> SendRequest(szHeaders,0,0);但我只收到“T?”。 – yejiKim

+0

我修改了'SendRequest()'调用。将参数列表留空。您应该检查'nRead'变量以查看接收到的数据字节数。之后,只需遍历'dataBuf'。 –