如何从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。帮我先生!
答
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'。 –
'8.8.8.8'是谷歌的公共DNS服务器。你为什么期望在那里找到一个Web服务器?你可以尝试'example.com',但不要殴打不受你控制的服务器。 –
您需要发送HTTP请求,然后服务器才会响应HTTP响应。为什么服务器在你连接后才开始发送数据? –