使用 Wininet 发送多个 Http 请求

Posted

技术标签:

【中文标题】使用 Wininet 发送多个 Http 请求【英文标题】:Sending multiple Http request with Wininet 【发布时间】:2016-04-24 14:29:18 【问题描述】:

所以我做了这个简单的例子:我从客户端 PC 发送一个 http 请求,它在树莓派上执行一个 php 脚本来计算目录中的文件数,然后第二个请求执行一个 php 脚本来删除它们,然后再次执行第一个脚本以确保其正常工作。

问题是我第二次询问文件的数量,它返回了我第一次调用函数的结果,删除文件的脚本也起作用了。我在网络上使用了wireshark,实际上我看到第二个计数文件的请求没有发送,我不明白为什么,是我的代码吗?还是来自http协议?

这是我的代码,只有 2 个请求来计算 ADL 文件的数量,只有这样我才能在 Wireshark 上看到仅应请求发送:

#include "MA_DLLCPP.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <wininet.h>
#include <string.h>


 int main(int argc, char* argv[])

    int error = 0;
char* result = 0;
DWORD dwBytes;
char ch [100] = "0";
char ligne [100] = "";
char ligne1 [100] = "";
HINTERNET Initialize,Connection,File;

//Création de la session internet
Initialize = InternetOpenA("pi",INTERNET_OPEN_TYPE_DIRECT,"","",0);

if(Initialize == NULL) return 1;

//Connection HTTP serveur-client
Connection =                                      InternetConnectA(Initialize,"192.168.1.2",INTERNET_DEFAULT_HTTP_PORT,
        NULL,NULL,INTERNET_SERVICE_HTTP,0,0);




strcat(ligne, "IHM_DLD/services/");
strcat(ligne, "getADL");
strcat(ligne, ".php");

//Création de la requete HTTP
    File = HttpOpenRequestA(Connection, "GET",ligne,NULL,NULL,NULL,0,0);

    if(File == NULL) return 3;


    //Envoi de la requete HTTP
    if(HttpSendRequestA(File,NULL,0,NULL,0) == FALSE) return 4;

    //Lecture de la réponse du serveur
    if(InternetReadFile(File,&ch,1,&dwBytes) == FALSE) return 5;

    while(InternetReadFile(File,&ch,1,&dwBytes))
    
        // cas d'erreur en cas d'absence de retour
        if(dwBytes != 1) break;

        printf("%s",ch);

    


InternetCloseHandle(File);
InternetCloseHandle(Connection);
InternetCloseHandle(Initialize);

//Connection HTTP serveur-client
    Connection = InternetConnectA(Initialize,"192.168.1.2",INTERNET_DEFAULT_HTTP_PORT,
            NULL,NULL,INTERNET_SERVICE_HTTP,0,0);

//Création de la requete HTTP
        File = HttpOpenRequestA(Connection, "GET",ligne,NULL,NULL,NULL,0,0);

        if(File == NULL) return 3;


        //Envoi de la requete HTTP
        if(HttpSendRequestA(File,NULL,0,NULL,0) == FALSE) return 4;

        //Lecture de la réponse du serveur
        if(InternetReadFile(File,&ch,1,&dwBytes) == FALSE) return 5;

        while(InternetReadFile(File,&ch,1,&dwBytes))
        
            // cas d'erreur en cas d'absence de retour
            if(dwBytes != 1) break;

            printf("%s",ch);

        




InternetCloseHandle(File);
InternetCloseHandle(Connection);
InternetCloseHandle(Initialize);

【问题讨论】:

【参考方案1】:

对我来说听起来像是chaching effect。第二次在您的机器上本地处理请求。

我从未使用过它,但在 HttpOpenRequestdwFlags 参数中传递 INTERNET_FLAG_NO_CACHE_WRITE 看起来应该可以解决问题...

你也可以看看这个帖子:How to clear MSIE/WinInet cache programatically?

【讨论】:

以上是关于使用 Wininet 发送多个 Http 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何中止使用 wininet 发送的请求?

使用wininet的异步请求

在 C++ 中使用 Wininet 发送 POST 请求时的编码问题

wininet api 将文件发送到 http web 服务

Wininet SSL 与每个请求的客户端证书智能卡访问

为 WININET HTTP 请求使用特定的网络接口