繁体   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