[英]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服務器,則必須記住:
以您的示例為例:
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.