지금 회사에서 PDA 프로그램을 만들고 있습니다
배송용 PDA 인데 3G 네트워크가 자꾸 끊겨서
Ras 로 자동연결하도록 개발 했습니다.
3G가 끊겼을시 인터넷은 정상적으로 연결이 되는데
문제가 HttpSendRequest 이 부분에서 1분에서 3분까지 멈춰있는 경우가 많아요
정상적으로 될때도 있는데 아무래도 인터넷은 연결됐지만
프로그램에서 멈춰있으니 기다릴수 밖에 없는데
1분에서 3분은 너무 길구요ㅜ 좀 찾아보니깐 버그라고 하던데..
InternetSetOption 이 작동되지 않는 버그라고 하더라구요.
Thread 만들어서 timeout 작동되게 하면 된다고 하던데
인터넷에 찾아봐도 다 VC++ 밖에 없어서 ㅜㅜ evc로 개발하다보니
적용을 못하겠네요. 그럼 함수 호출 부분 소스 보여드리겠습니다.
좀 도와주시면 감사하겠습니다
CString CWMSonPDAApp::NetRequest(CString strSubUrl, BOOL isRas)
{
if(isRas == TRUE)
{
RasSync();
}
BOOL bRet = FALSE;
BeginWaitCursor();
HINTERNET hSession = NULL;
hSession = InternetOpen(_T("ChegimPDA"), PRE_CONFIG_INTERNET_ACCESS, NULL, INTERNET_INVALID_PORT_NUMBER, 0);
DWORD timeout = 5000;
InternetSetOption(hSession, INTERNET_OPTION_MAX_CONNS_PER_SERVER, &timeout, sizeof(timeout));
if (hSession == NULL)
{
AfxMessageBox(_T("InternetOpen 실패") );
InternetCloseHandle(hSession);
return _T("");
}
HINTERNET hDomain = NULL;
hDomain = InternetConnect(hSession, m_strDomain, m_nInetPort, _T(""), _T(""), INTERNET_SERVICE_HTTP, 0, (DWORD) 0);
if (hDomain == NULL)
{
AfxMessageBox(_T("InternetConnect 실패") );
InternetCloseHandle(hDomain);
return _T("");
}
HINTERNET hRequest = NULL;
hRequest = HttpOpenRequest(hDomain, _T("POST"), strSubUrl, NULL, NULL, NULL, INTERNET_FLAG_DONT_CACHE, 0);
if( hRequest == NULL)
{
AfxMessageBox( _T("오픈실패") );
}
DWORD dwConnectionTypes;
if(InternetGetConnectedState(&dwConnectionTypes, 0)) // 정상적으로 검사됨
{
if((dwConnectionTypes & INTERNET_CONNECTION_OFFLINE) != 0){
// AfxMessageBox( _T("오프라인 상태 ") );
EndWaitCursor();
return _T("");
}
}else
{
}
BOOL bSucc = HttpSendRequest(hRequest, NULL, 0, NULL, 0);
if(!bSucc )
{
AfxMessageBox( _T("접속이 끊어짐 ") );
EndWaitCursor();
InternetCloseHandle (hRequest);
m_hSession= NULL;
hRequest = NULL;
return _T("");
}
char *databuff = NULL;
char *tempbuff = NULL;
CString strWEBPage = _T("");
char buff[1026];
DWORD dwRetSize = 0;
DWORD dwTotlaSize = 0;
memset(buff, 0, 1026);
while( InternetReadFile(hRequest, &buff[0], 1024, &dwRetSize ) )
{
if( dwRetSize == 0)
break;
dwTotlaSize += dwRetSize;
if( databuff == NULL )
{
databuff = (char*) malloc(dwRetSize + 1);
memcpy(databuff, &buff[0], dwRetSize);
}
else
{
if( tempbuff != NULL )
{
free(tempbuff);
tempbuff = NULL;
}
tempbuff = (char*) malloc(dwTotlaSize + 1);
memset(tempbuff, 0, dwTotlaSize + 1);
memcpy(tempbuff, databuff, dwTotlaSize - dwRetSize );
memcpy(&tempbuff[dwTotlaSize - dwRetSize], &buff[0], dwRetSize);
if( databuff != NULL )
{
free(databuff);
databuff = NULL;
databuff = (char*) malloc(dwTotlaSize + 1);
memset(databuff, 0, dwTotlaSize + 1);
memcpy(databuff, tempbuff, dwTotlaSize + 1);
}
}
memset(buff, 0, 1026);
}
if( dwTotlaSize == 0 )
{
EndWaitCursor();
return _T("");
}
databuff[dwTotlaSize] = '\0';
strWEBPage += databuff;
if( tempbuff != NULL )
{
free(tempbuff);
tempbuff = NULL;
}
if( databuff != NULL )
{
free(databuff);
databuff = NULL;
}
InternetCloseHandle(hRequest);
hRequest = NULL;
strWEBPage.TrimLeft();
strWEBPage.TrimRight();
EndWaitCursor();
return strWEBPage;
}