게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
evc++ 4.0 HttpSendRequest 멈춤현상
게시물ID : computer_52423짧은주소 복사하기
작성자 : 세상
추천 : 0
조회수 : 1868회
댓글수 : 2개
등록시간 : 2012/07/12 19:45:53

지금 회사에서 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;
}

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호