先日ネットワークプログラムの件で質問させていただき、みなさんにこころよく協力していただきました
とりあえずチャットプログラムを・・・と思ったんですが、チャット以前にネットワークの知識がないので、『猫でもわかるネットワークプログラミング』という参考書を購入し、読み進めているところです
が・・・早くも第2章でつまづきまして・・・
タイトルの通りのコンソールアプリを(ソースは参考書に載っていたのでそれを打ち込んだ)作ったんですが、実行はできるものの上手く動作していないようで、質問させていただきました
ソースは以下の通りです
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib" ) // WinInet.Lib
int main()
{
HINTERNET hInet, hUrl;
char szBuf[128], szUrl[128], *lpszSrc;
DWORD dwRead, dwTotal = 0;
HGLOBAL hMem;
// 目的のURLの入力
printf("URL -> ");
gets_s(szUrl);
// インターネット(WinInet)開始
hInet = InternetOpen((LPCWSTR)"test_winInet", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); // チェック1
if (hInet == NULL)
{
perror("オープンエラー\n");
return -2;
}
// HTTPセッションの開始、指定のURLオープン
hUrl = InternetOpenUrl(hInet, (LPCWSTR)szUrl, NULL, 0, 0, 0); // チェック2
if (hUrl == NULL)
{
perror("URLオープンエラー\n");
InternetCloseHandle(hInet);
return -3;
}
// lpszSrsに1バイトのみ確保
hMem = GlobalAlloc(GHND, 1);
lpszSrc = (char *)GlobalLock(hMem);
// 読み出すものがなくなるまで読み出す
while (1)
{
InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
szBuf[dwRead] = '\0';
// 読み出すものがなくなったのでループ脱出
if (dwRead == 0) break;
// 必要バイト数の計算
dwTotal += dwRead;
// 確保領域の大きさ変更
hMem = GlobalReAlloc(hMem, dwTotal + 1, GMEM_MOVEABLE);
if (hMem == NULL)
{
perror("再アロケート失敗\n");
}
lpszSrc = (char *)GlobalLock(hMem);
if (lpszSrc == NULL)
{
perror("メモリ確保に失敗\n");
break;
}
strcat(lpszSrc, szBuf);
} // while (1)
// ソースの表示
printf("%s\n", lpszSrc);
// メモリの解放
GlobalUnlock(hMem);
GlobalFree(hMem);
// インターネットハンドルの解放
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);
return 0;
}
チェック1の第1引数と、チェック2の第2引数はエラーが出たため自分なりにキャストしてみましたOS:windowsXP
C++
どなたかお力添えをお願いします
