【问题标题】:InternetReadFile to Char* in CInternetReadFile 到 C 中的 Char*
【发布时间】:2010-11-10 01:45:19
【问题描述】:

下面的代码有点问题。我已经看到了大量使用 InternetReadFile 保存到文件的示例。但我找不到一个,或者让它为 char[] 工作。我想把szBuffer加起来得到holdBuff,然后设置内容等于holdBuff。

#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <windows.h>
#include <WinInet.h>

HINTERNET hSession;
void urlToChar(char* url, char** content);

int main()
{
    hSession = InternetOpen("Mozilla/4.0 (compatible) Poison", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    char* content;
    urlToChar("http://google.com/", &content);
    printf("%s",content);
    return 0;
}

void urlToChar(char* url, char** content)
{
    HINTERNET hConnect = InternetConnect(hSession, _T(""),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = InternetOpenUrl(hSession, url, NULL, 0, 0, 0);
    if (hRequest)
    {
        char holdBuff[] = "";
        char szBuff[1025];
        memset(szBuff, 0x00, sizeof(szBuff));
        DWORD bytesRead;
        while (InternetReadFile(hRequest, szBuff, 1024, &bytesRead) == TRUE && bytesRead > 0)
        {
            // Cat szBuff to holdBuff
            memset(szBuff, 0x00, sizeof(szBuff));
        }
        *content = holdBuff;
        // memset(holdBuff, 0x00, sizeof(holdBuff));  <-- Need this?
    }
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
}

【问题讨论】:

  • 没有错误,我只是没有找到将 szBuff 连接到 holdBuff 的正确代码
  • 啊,现在我明白为什么你的循环中有评论了。我已添加到我的答案中。

标签: c wininet


【解决方案1】:

变量声明

char xyz[] = "Hello World!";

将告诉编译器将字符串的内容放入堆栈。当然,当你的函数返回时,堆栈就会消失。

所以在你的情况下:

char holdBuff[] = "";
...
*content = holdBuff;

这告诉编译器创建一个长度为 1 的字符串(NULL 终止符)作为局部变量。仅仅因为您将content 的值设置为holdBuff,并不意味着holdBuff 指向的内容已经存在。

你必须纠正两件事。首先,您必须使用strcpy() 或类似功能。其次,你必须为holdBuff分配足够的空间。

例子:

char holdBuff[4096];    // or some other sufficiently large size
...
*content = malloc (strlen(holdBuff) + 1);
strcpy (*content, holdBuff);

完成后,您需要在main() 中发送free(content)


现在,关于如何实际进行连接:如果你完全忘记使用szBuff,直接写信给holdBuff,你的表现会更好。

char* temp = holdBuff;
while (InternetReadFile(hRequest, temp, 1024, &bytesRead) == TRUE && bytesRead > 0)
{
    temp += bytesRead;
}
*temp = '\0';    // manually append NULL terminator

现在holdBuff 将拥有您想要的数据,无需中间连接。

【讨论】:

  • 完美运行,非常感谢。过去一天左右,我一直在为此拔头发。
【解决方案2】:
void urlToChar(char* url, char** content)
{
    HINTERNET hConnect = InternetConnect(hSession, _T(""),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = InternetOpenUrl(hSession, url, NULL, 0, 0, 0);
    if (hRequest)
    {
        char holdBuff[] = "";   //do not use fixed size char array and allocate buffer in stack,you can allocate large enough buffer in heap,but recommend you can use string or CString
        char szBuff[1025];
        memset(szBuff, 0x00, sizeof(szBuff));
        DWORD bytesRead;
        while (InternetReadFile(hRequest, szBuff, 1024, &bytesRead) == TRUE && bytesRead > 0)
        {
            // Cat szBuff to holdBuff
            //strcat when using char array
            // operator+ when using stl string
            // [stl string][1]
            memset(szBuff, 0x00, sizeof(szBuff));
        }
        *content = holdBuff;
        // memset(holdBuff, 0x00, sizeof(holdBuff));  <-- Need this?
    }
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
}

【讨论】:

  • 突出显示您的代码并按下“代码”格式化按钮(1010 事物)。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2010-09-22
  • 2012-07-05
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多