2016-08-05 107 views
1

我是一名學習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響應。爲什麼服務器在你連接後纔開始發送數據? –

回答

2

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'。 –

相關問題