我写了一个使用WinInet-library的程序。该计划每天运行约8-12小时。首先它连接到互联网,然后使用FTP来下载/上传文件。之后它启动一个循环,在不同的时间间隔内启动两个线程。两个线程都在执行GET
- 对同一服务器的请求,看起来像这样:
private void Thread()
{
if(!InternetGetConnectedState(NULL, NULL))
{
connectToInternet();
}
// some code...
HINTERNET httpOpenRequest = HttpOpenRequest(
hHTTPConnection, // InternetConnect-Handle
L"GET", // HTTP-Verb
request_target, // FileName
L"HTTP/1.1", // HTTP-Version
NULL, // Referer
NULL, // AcceptTypes
INTERNET_FLAG_RELOAD, // Flags
0 // Context
);
BOOL httpsRequest = HttpSendRequest(
httpOpenRequest, // Handle of HttpOpenRequest
NULL, // Headers
0, // Headers-Length
NULL, // Optional
0 // Optional-Length
);
InternetCloseHandle(httpOpenRequest); // App-Crash sometimes here!
}
我的connectToInternet
- 函数在这里:
int connectToInternet()
{
DWORD InetTest1 = 16000;
while (InetTest1 != 0)
{
InetTest1 = InternetAttemptConnect(0);
// wait 1 second for next attempt
if (InetTest1 != 0)
{
Sleep(1000);
}
}
BOOL InetTest2 = FALSE;
while (!InetTest2)
{
InetTest2 = InternetCheckConnection(
L"http://www.example.com", // URL
FLAG_ICC_FORCE_CONNECTION, // Flags
0 // Reserved
);
// wait 1 second for next attempt
if (!InetTest2)
{
Sleep(1000);
}
}
while (hInternetOpen == NULL)
{
hInternetOpen = InternetOpen(
L"Custom-Agent", // Agent
INTERNET_OPEN_TYPE_DIRECT, // AccessType
NULL, // ProxyName
NULL, // ProxyBypass
0 // Flags
);
// wait 1 second for next attempt
if (hInternetOpen == NULL)
{
Sleep(1000);
}
}
while (hHTTPConnection == NULL)
{
hHTTPConnection = InternetConnect(
hInternetOpen, // InternetOpen-Handle
L"www.example.com", // ServerName
INTERNET_DEFAULT_HTTP_PORT, // ServerPort
NULL, // Username
NULL, // Password
INTERNET_SERVICE_HTTP, // Service
0, // Flags
0 // Context
);
// wait 1 second for next attempt
if (hHTTPConnection == NULL)
{
Sleep(1000);
}
}
return 0;
}
(我在这里找到的这个功能的基本工作流程:https://msdn.microsoft.com/en-us/library/windows/desktop/aa383996(v=vs.85).aspx)
现在问题:
Q1: 当两个线程中的一个调用InternetCloseHandle(httpOpenRequest)
时,我似乎很少遇到应用崩溃。我无法找到这些应用程序崩溃的原因......你有什么想法吗?
Q2: 运行程序的笔记本电脑似乎存在互联网连接问题,因为它会经常连续几分钟或几小时失去连接。因此,如果connectToInternet()
为InternetGetConnectedState(NULL, NULL)
,我会先在两个主题中调用false
。是否需要执行此步骤,或者如果我不调用connect-function,它是否也可以工作?如果连接中断,全局HINTERNET
- 句柄是否无效?
[编辑] 同时我怀疑我的程序导致连接问题,因为我的有线网络上也没有互联网访问权限在家!我做错了吗?