2016-08-05 3 views
1

Ich bin ein Student, der MFC studiert. Ich möchte eine Antwort von einer HTTP-Server-Socket-Programmierung in MFC erhalten. Aber ich kann dieses Problem nicht lösen.Wie kann ich eine Antwort von einem HTTP-Server in MFC erhalten?

Mein Code ist:

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

Es gibt keine Fehler, aber ich erhielt NULL. Hilf mir, mein Herr!

+0

'8.8.8.8' sind öffentlicher DNS-Server von Google. Warum erwarten Sie dort einen Webserver? Sie könnten 'example.com' ausprobieren, aber nicht Server, die Sie nicht kontrollieren. –

+0

Sie müssen eine HTTP-Anforderung senden, bevor der Server mit einer HTTP-Antwort antwortet. Warum sollte der Server Daten senden, nachdem Sie nur eine Verbindung hergestellt haben? –

Antwort

2

MFC implementiert Internetsitzungen als Objekte der Klasse CInternetSession. Mit dieser Klasse können Sie eine Internetsitzung oder mehrere gleichzeitige Sitzungen erstellen. Hier

ein Beispiel:

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

Sie auch nackte Knochen nach unten gehen zu können:

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

Sorry, ich kann sehen "Fehler C2065: 'params': nicht deklarierte Kennung", also habe ich es so korrigiert: pFile-> SendRequest (szHeaders, 0, 0); Aber ich habe nur "T?" Erhalten. – yejiKim

+0

Ich habe 'SendRequest()' Anruf geändert. Lassen Sie die Parameterliste leer. Sie sollten die 'nRead'-Variable überprüfen, um die Anzahl der empfangenen Datenbytes zu sehen. Danach iteriere einfach "dataBuf". –

Verwandte Themen