【问题标题】:C++ WinSock Get Data From PHP Page?C++ WinSock 从 PHP 页面获取数据?
【发布时间】:2016-11-13 09:20:02
【问题描述】:

您好,我对使用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

我做错了什么?

顺便说一句,在我的情况下,我不想使用任何 librariesboost 或类似的东西。感谢您的帮助:)

【问题讨论】:

    标签: php c++ sockets web connection


    【解决方案1】:

    如果你想通过套接字访问网络服务器,你必须牢记:

    • 您可以打开与您的 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
    

    更准确地说,如果你想访问你的服务器,你必须看看 GET、PUT、POST 等在 http 协议中是如何实现的,发送正确的命令到你的 web 服务器和 recv()回复

    【讨论】:

      【解决方案2】:
      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 文档所需的整个客户端进程,它们将自己处理套接字连接。

      但是尝试自己实现它也没有错。这是一个很好的编程excersize。

      所以,解析www.example.com的IP地址后,你需要

      1) 连接到服务器的 80 端口,默认的 HTTP 端口。

      2) 为“/index.php?Example=StringExample”发送 HTTP 请求。

      3) 解析 HTTP 响应。

      HTTP 请求和响应的规范由 RFC 2616 定义,您可以查阅该规范以获取有关 HTTP 请求和响应结构的完整文档。

      【讨论】:

        猜你喜欢
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        • 2019-11-12
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        相关资源
        最近更新 更多