簡體   English   中英

C ++ WinSock是否從PHP頁面獲取數據?

[英]C++ WinSock Get Data From PHP Page?

您好,我對使用sockets還很陌生,並且對它們還不那么熟悉,基本上我想要做的就是將string variable傳遞給web address (例如, www.example.com/index.php?Example=StringExample )然后得到響應,因此例如,如果index.php看起來像這樣,它將返回"Test Example"

<?php

if($_GET['Example'] == "StringExample")
{
    echo "Test Example";
}

?>

這是我在c ++中嘗試過的方法:

struct sockaddr_in SocketAddress;
hostent* addr = gethostbyname("www.example.com/index.php?Example=StringExample");
int sizeofaddr = sizeof(addr);
SocketAddress.sin_addr.s_addr = inet_addr(addr->h_name);
SocketAddress.sin_port = htons(80);
SocketAddress.sin_family = AF_INET; 

SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL); 
if (connect(Connection, (SOCKADDR*)&addr, sizeofaddr) != 0) 
{
    return 0; //Failed to Connect
}

char buffff[256];
recv(Connection, buffff, sizeof(buffff), NULL);
//"Test Example" now stored in    buffff

我究竟做錯了什么?

順便說一句,在我的情況下,我不想使用諸如boost類的任何libraries 謝謝您的幫助 :)

gethostbyname("www.example.com/index.php?Example=StringExample");

“ www.example.com/index.php?Example=StringExample”不是有效的服務器名稱。 這是一個完整的URL; 服務器名稱為“ www.example.com”。 gethostbyname()采用服務器名稱(而不是URL),並返回其IP地址。 此外, gethostbyname()已被淘汰。 新代碼應改為使用getaddrinfo(3)函數。

顯然,這是一個HTTP URL。 要通過HTTP下載文檔,不僅要連接套接字,還要做很多工作。 建立套接字連接只是從HTTP服務器下載文檔的第一步。 這之后必須發送有效的HTTP請求,然后從服務器接收HTTP響應。

有很多庫,例如curl ,可以實現下載HTTP文檔所需的整個客戶端過程,這些過程將自己處理套接字連接。

但是,嘗試自己實現也沒有錯。 這是一個很好的編程專家。

因此,在解析www.example.com的IP地址之后,您需要

1)連接到服務器的端口80(默認的HTTP端口)。

2)發送HTTP請求“ /index.php?Example=StringExample”。

3)解析HTTP響應。

HTTP請求和響應的規范由RFC 2616定義,您可以查閱該規范以獲取有關HTTP請求和響應的結構的完整文檔。

如果要使用套接字訪問Web服務器,則必須記住:

  • 您可以打開到Web服務器的TCP / IP連接
  • 但是之后,您必須自己執行http協議

以您的示例為例:

hostent* addr = gethostbyname("www.example.com");
//...
const char* request = "GET index.html"
send(Connection, request, strlen(request), NULL)
//fetch index.html with a recv and parse it

更准確地說,如果要訪問服務器,則必須看看如何在http協議中實現GET,PUT,POST等,將適當的命令發送到Web服務器並recv()答復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM