当前位置:编程学习 > wap >>

brew上怎么判断网络不通?

现在在brew上做一个利用IWeb接口 发送接收数据的程序,流程是这样的:客服端post一个数据包给服务器,然后服务器收到数据包后会响应客户端一个数据包。

下面是我的源码:
int NH_GetInstallCode( )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE();
UIBOOL nRet = UIFALSE;
char szSetupNum[50]; //安装码
nRet = UI_GetInstallCode( pMe, szSetupNum, pMe->g_NavRegisterInfo.szIMEINum );
if ( nRet == UIFALSE )
{
return 0;
}
navi_memcpy( pMe->g_NavRegisterInfo.szSetupNum, szSetupNum, navi_strlen(szSetupNum) );
NavLog( "NH_GetInstallCode:[%s]\n", pMe->g_NavRegisterInfo.szSetupNum );
return 1;
}

//设置参数
int NH_AddWebOpt( )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE();
int i = 0;
int nRet = -1;
WebOpt awo[15]; 

if ( pMe->g_pIWeb == NULL )
return 0;
    //1
awo[i].nId  = WEBOPT_CONNECTTIMEOUT;
awo[i].pVal = (void *)100000;
i++;

awo[i].nId  = WEBOPT_USERAGENT;
awo[i].pVal = (void *)WEBBER_USERAGENT;
i++;
    //2
//  awo[i].nId  = WEBOPT_BODY;
//  awo[i].pVal = (void *)pMe->g_pISource;
//  i++;
    //3
//  awo[i].nId  = WEBOPT_METHOD;
//  awo[i].pVal = (void *)"post";
//  i++;
    //4
awo[i].nId  = WEBOPT_HANDLERDATA;
awo[i].pVal = (void *)pMe;
i++;
    //5
//  awo[i].nId  = WEBOPT_HEADERHANDLER;
//  awo[i].pVal = (void *)NH_WebHeader;
//  i++;
    //6
//  awo[i].nId  = WEBOPT_STATUSHANDLER;
//  awo[i].pVal = (void *)NH_WebStatus;
//  i++;
    //7
//  awo[i].nId  = awo[i].nId  = WEBOPT_STATUSHANDLER;
//  awo[i].pVal = (void *)NH_WebStatus;
//  i++;
    //8
//  awo[i].nId = WEBOPT_CONTENTLENGTH;
//  awo[i].pVal = (void *)STRLEN(pMe->g_pszPostData + 1);
//  i++;
    //9
awo[i].nId  = WEBOPT_FLAGS;
awo[i].pVal = (void *)WEBREQUEST_NOWAITCONN;
i++;
//10
awo[i].nId  = WEBOPT_FLAGS;
awo[i].pVal = (void *)WEBREQUEST_FORCENEWCONN;
i++;
//11
awo[i].nId  = WEBOPT_PROXYSPEC;
awo[i].pVal = (void *)"http:///";
i++;
//12
awo[i].nId  = WEBOPT_PROXYSPEC;
awo[i].pVal = (void *)"*:///http://besideyou.mapabc.com:8080/navisoftware/qdactive.do";
i++;
    //13
awo[i].nId  = WEBOPT_END;

nRet = IWEB_AddOpt( pMe->g_pIWeb,awo);
if ( nRet == SUCCESS )
{
return 1;
}

return 0;
}

//读取服务器反馈过来的数据包
void NH_ReadFromWebCB( void *po )
{
CGPSApp *pMe = (CGPSApp*)po;
char szBuffer[1024] = {0};
int byteCount = 0;

byteCount = ISOURCE_Read( pMe->g_pISource, szBuffer, sizeof(szBuffer) );
if ( byteCount >= 65)
{
NavLog("szBuffer:%s \n", szBuffer);
}

switch ( byteCount )
{
case ISOURCE_WAIT:
{
ISOURCE_Readable(pMe->g_pISource, &pMe->g_WebCallBack );
return;
}
case ISOURCE_ERROR:
case ISOURCE_END:
default:
{
ISOURCE_Readable(pMe->g_pISource, &pMe->g_WebCallBack );
return;
}
}
}

//http response
void NH_WebRespCallBack( void *po )
{
CGPSApp *pMe = (CGPSApp*)po;

// get info about the response 
pMe->g_pWebRespInfo = IWEBRESP_GetInfo( pMe->g_pIWebResp ); 

//check error code
if ( !WEB_ERROR_SUCCEEDED( pMe->g_pWebRespInfo->nCode) )
{
return;
}

//get pointer to Source object 
pMe->g_pISource = pMe->g_pWebRespInfo->pisMessage;
if ( pMe->g_pISource == NULL )
{
return;
}

//register Isource Read callback 
CALLBACK_Init( &pMe->g_WebCallBack, NH_ReadFromWebCB, pMe );

//post a read; data is processed by ISource callback 
ISource_Readable( pMe->g_pISource, &pMe->g_WebCallBack );

}

//IWeb 状态
 void NH_WebStatus( void *po, WebStatus ws, void *pVal)
{
 char *pszStatus = NULL;
 (void)pVal;
 
 switch (ws) {
 case WEBS_CANCELLED:
 pszStatus = "** cancelled...\n";
 break;
 case WEBS_GETHOSTBYNAME:
 pszStatus = "** finding host...\n";
 break;          
 case WEBS_CONNECT:
 pszStatus = "** connecting...\n";
 break;
 case WEBS_SENDREQUEST:
 pszStatus = "** sending...\n";
 break;
 case WEBS_READRESPONSE:
 pszStatus = "** receiving...\n";
 break;
 case WEBS_GOTREDIRECT:
 break;
 case WEBS_CACHEHIT:
 pszStatus = "** cache hit...\n";
 break;
 }
 
 // show that status!
 if ((char *)0 != pszStatus) 
 {
 DBGPRINTF( "pwa->pParent: %s", pszStatus);
 }
}

//返回信息头
void NH_WebHeader(void *po, const char *cpszName, GetLine *pglVal)
{
CGPSApp *pMe = (CGPSApp*)po;

    if ((char *)0 != cpszName) 
{
NavLog( "NH_WebHeader: %s\n", cpszName);
    }
    NavLog( "%s\n", pglVal->psz );
}

//请求的数据包
int NH_WebRequestXMLData( char *szData )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE();
if ( szData == NULL )
return 0;

navi_sprintf( szData, 
"<?xml version=\"1.0\" encoding=\"GBK\" ?>\
<opg>\
<activitycode>0004</activitycode>\
<processtime>20080411121010</processtime>\
<actioncode>0</actioncode>\
<svccont>\
<info>\
<udid>%s</udid>\
<sequenceid>%s</sequenceid>\
<installnum>%s</installnum>\
<type>brew</type>\
<syscode>%s</syscode>\
</info>\
</svccont>\
</opg>",
pMe->g_NavRegisterInfo.szIMEINum, 
pMe->g_NavRegisterInfo.szSerialNum, 
pMe->g_NavRegisterInfo.szSetupNum,
pMe->g_NavRegisterInfo.szSysCode
);

return 1;
}


//开始激活
int NH_WebStart( )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE( );
int nRet = -1;
char szDataPath[256] = {0};
//服务器地址
pMe->g_pszUrl = STRDUP( REGISTERADDRESS );
//计算安装码
nRet = NH_GetInstallCode( );
if ( nRet == 0 )
return 0;

//请求内容
NH_WebRequestXMLData( pMe->g_pszPostData );

//参数设置
nRet = NH_AddWebOpt();
if ( nRet == 0 )
return 0;

// if there's post data, construct a stream for IWeb to consume
if ((char *)0 != pMe->g_pszPostData)
{
// *pMe->g_pszPostData = 0;
if (SUCCESS == 
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOURCEUTIL, 
(void **)&pMe->g_pISourceUtil)) 
{

ISOURCEUTIL_SourceFromMemory( pMe->g_pISourceUtil, pMe->g_pszPostData + 1, 
navi_strlen(pMe->g_pszPostData + 1), 0, 0,
&pMe->g_pISource ); //此函数用于生成从内存块获取数据的新 IPeek 接口对象。
ISOURCEUTIL_Release( pMe->g_pISourceUtil);
}
   }

    //设置接收响应的回调
CALLBACK_Init( &pMe->g_WebCallBack, NH_WebRespCallBack, pMe );

if ( (ISource*)0 != pMe->g_pISource )
{
NavLog( "URL: %s\n", pMe->g_pszUrl );
IWEB_GetResponse(pMe->g_pIWeb,
(pMe->g_pIWeb, &pMe->g_pIWebResp, &pMe->g_WebCallBack, pMe->g_pszUrl, 
WEBOPT_HANDLERDATA, pMe,
WEBOPT_HEADER, "X-Method: POST\r\n", /* for kicks */
WEBOPT_HEADERHANDLER, NH_WebHeader,
WEBOPT_STATUSHANDLER, NH_WebStatus,
WEBOPT_METHOD, "POST",
WEBOPT_BODY, pMe->g_pISource,
WEBOPT_CONTENTLENGTH, STRLEN(pMe->g_pszPostData + 1),
WEBOPT_END));
}
else
{
NavLog( "URL: %s\n", pMe->g_pszUrl );
IWEB_GetResponse(pMe->g_pIWeb,
(pMe->g_pIWeb, &pMe->g_pIWebResp, &pMe->g_WebCallBack, pMe->g_pszUrl, 
WEBOPT_HANDLERDATA, pMe,
WEBOPT_HEADER, "X-Method: GET\r\n", /* for kicks */
WEBOPT_HEADERHANDLER, NH_WebHeader,
WEBOPT_STATUSHANDLER, NH_WebStatus,
WEBOPT_END));
}

return 1;

}

程序调用的入口是:int NH_WebStart( )。

我遇到的问题是:
1、既然在NH_AddWebOpt( )设置了WEBOPT_CONNECTTIMEOUT参数,但是不知道在哪里判断连接超时?
2、怎么判断网络不通???

请大家支招,回答尽量详细,到位。。。O(∩_∩)O哈哈~    谢谢  
--------------------编程问答-------------------- 如果网络通 pMe->m_pWRI->nCode 返回的这个值为 200
这个值可以在回调函数里用 IWEBRESP_GetInfo(pMe->m_pIWebResp)取得
希望我的回答对你有用! --------------------编程问答-------------------- 已经在真机上调试成功,希望对大家有用。。。一些函数是我项目上写的,大家可以自行去掉。
代码贴出来
其中
NaviHttp.h文件
#ifndef _NAVI_HTTP_H
#define _NAVI_HTTP_H


#define CHAR_MAX_LEN     50
#define XML_MAX_LEN      1024

typedef struct _tagStructRegisterInfo
{
char szSerialNum[CHAR_MAX_LEN]; //序列号
char szSetupNum[CHAR_MAX_LEN]; //安装码
char szIMEINum[CHAR_MAX_LEN]; //IMEI
char szActiveNum[CHAR_MAX_LEN]; //激活码
char szSysCode[CHAR_MAX_LEN]; //SYSCODE


}NavRegisterInfo;

//开始激活
extern int NH_WebStart();
extern int NH_GetInstallCode( );

#endif



NaviHttp.c文件

#define REGISTERADDRESS "http://ctest.mapabc.com:8080/navisoftware/qdactive.do"
#define WEBBER_USERAGENT   "NetDiagnostics/1.0 (built on "__DATE__")\r\n"

//设置参数
int NH_AddWebOpt( )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE();
int i = 0;
int nRet = -1;
WebOpt awo[15]; 

if ( pMe->g_pIWeb == NULL )
return 0;


awo[i].nId  = WEBOPT_USERAGENT;
awo[i].pVal = (void *)WEBBER_USERAGENT;
i++;
        //4
awo[i].nId  = WEBOPT_HANDLERDATA;
awo[i].pVal = (void *)pMe;
i++;
          //9
awo[i].nId  = WEBOPT_FLAGS;
awo[i].pVal = (void *)WEBREQUEST_NOWAITCONN;
i++;
//10
awo[i].nId  = WEBOPT_FLAGS;
awo[i].pVal = (void *)WEBREQUEST_FORCENEWCONN;
i++;
    //13
awo[i].nId  = WEBOPT_END;

nRet = IWEB_AddOpt( pMe->g_pIWeb,awo);
if ( nRet == SUCCESS )
{
return 1;
}

return 0;
}


//读取服务器反馈过来的数据包
void NH_ReadFromWebCB( void *po )
{
CGPSApp *pMe = (CGPSApp*)po;
char szBuffer[1024] = {0};
int byteCount = 0;
int nRet = -1;
char szGetValue[128] = {0};

NavLog("NH_ReadFromWebCB start!!! \n");
byteCount = ISOURCE_Read( pMe->g_pISource, szBuffer, sizeof(szBuffer) );
NavLog( "ISOURCE_Read byteCount:[%d]\n", byteCount );
if ( byteCount != 0 && byteCount != -1 && byteCount != -2 )
{
//处理服务器响应XML数据包
NavLog("NH_Deal_WebResp start!!!\n");
NH_Deal_WebResp( szBuffer );
NavLog("NH_Deal_WebResp end!!\n");

return;
}
else
{
switch ( byteCount )
{
case ISOURCE_WAIT: //此时无可用数据;调用 Readable() 以等待
{
NavLog( "ISOURCE_WAIT & ISOURCE_Readable \n", byteCount );
ISOURCE_Readable(pMe->g_pISource, &pMe->g_WebCallBack );
return;
}
case ISOURCE_ERROR:
{
NavLog( "ISOURCE_ERROR & NH_WebCleanUp \n", byteCount );
NH_WebCleanUp();
}
break;
case ISOURCE_END:
{
NavLog( "ISOURCE_ERROR & NH_WebCleanUp \n", byteCount );
NH_WebCleanUp();
}
break;
default:
{
NavLog( "default & ISOURCE_Readable \n", byteCount );
ISOURCE_Readable(pMe->g_pISource, &pMe->g_WebCallBack );
return;
}
}
}

}

//响应服务器
void NH_WebRespCallBack( void *po )
{
CGPSApp *pMe = (CGPSApp*)po;
    NavLog( "NH_WebRespCallBack Start!!! \n" );
// get info about the response 
pMe->g_pWebRespInfo = IWEBRESP_GetInfo( pMe->g_pIWebResp ); 
if ( pMe->g_pWebRespInfo == NULL )
{
NavLog( "NH_WebRespCallBack IWEBRESP_GetInfo Fail!! \n" );
return;
}

//check error code
if ( !WEB_ERROR_SUCCEEDED( pMe->g_pWebRespInfo->nCode) )
{
NavLog( "NH_WebRespCallBack WEB_ERROR_SUCCEEDED!! \n" );
return;
}

//get pointer to Source object 
pMe->g_pISource = pMe->g_pWebRespInfo->pisMessage;
if ( pMe->g_pISource == NULL )
{
NavLog( "NH_WebRespCallBack pMe->g_pISource is NULL!! \n" );
return;
}

//register Isource Read callback 
CALLBACK_Init( &pMe->g_WebCallBack, NH_ReadFromWebCB, pMe );

//post a read; data is processed by ISource callback 
ISource_Readable( pMe->g_pISource, &pMe->g_WebCallBack );

}

//IWeb 状态
 void NH_WebStatus( void *po, WebStatus ws, void *pVal)
{
 CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE();
 char *pszStatus = NULL;
 (void)pVal;
 
 switch (ws) {
 case WEBS_CANCELLED:
 pszStatus = "** cancelled...\n";
 NavLog( "** cancelled...\n" );
 break;
 case WEBS_GETHOSTBYNAME:
 pszStatus = "** finding host...\n";
 NavLog( "** finding host...\n" );
 break;          
 case WEBS_CONNECT:
 {
 pszStatus = "** connecting...\n";
 NavLog( "** connecting...\n" );
 pMe->g_bIsRespSuccess = 1; //连接成功
 }
 break;
 case WEBS_SENDREQUEST:
 pszStatus = "** sending...\n";
 NavLog( "** sending...\n" );
 break;
 case WEBS_READRESPONSE:
 pszStatus = "** receiving...\n";
 NavLog( "** receiving...\n" );
 break;
 case WEBS_GOTREDIRECT:
 break;
 case WEBS_CACHEHIT:
 pszStatus = "** cache hit...\n";
 NavLog( "** cache hit...\n" );
 break;
 }
 
 // show that status!
 if ((char *)0 != pszStatus) 
 {
 DBGPRINTF( "pwa->pParent: %s", pszStatus);
 }
}

//返回信息头
void NH_WebHeader(void *po, const char *cpszName, GetLine *pglVal)
{
CGPSApp *pMe = (CGPSApp*)po;
NavLog("NH_WebHeader start!!!\n ");
    if ((char *)0 != cpszName) 
{
NavLog( "NH_WebHeader: %s\n", cpszName);
    }
    NavLog( "%s\n", pglVal->psz );
NavLog("NH_WebHeader end!!!\n ");
}

//请求的数据包
int NH_WebRequestXMLData( )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE();
JulianType  curJulinDate;

char szResquestHead1[] = \
"<?xml version=\"1.0\" encoding=\"GBK\"?>"\
"<opg>"\
"<activitycode>";

char szResquestHead2[] = "</activitycode>"\
"<processtime>";

char szResquestHead3[] = "</processtime>"\
"<actioncode>0</actioncode>"\
"<svccont>"\
"<info>";

char szResquestTail[] = \
"<type>brew</type>"\
"<syscode>9042</syscode>"\
"</info>"\
"</svccont>"\
"</opg>";

char* pRequestBody = NULL;
char szCode[] = "0004";
char szProcessTime[15] = {0};

if ( pMe->g_pszPostData == NULL )
return 0;

//当前系统时间
GETJULIANDATE( 0, &curJulinDate );
navi_sprintf( szProcessTime, "%04d%02d%02d%02d%02d%02d", curJulinDate.wYear, curJulinDate.wMonth, curJulinDate.wDay, 
curJulinDate.wHour, curJulinDate.wMinute, curJulinDate.wSecond );

pRequestBody = (char*)navi_malloc(MAX_PATH);
if ( pRequestBody == NULL )
return 0;

navi_sprintf( pRequestBody, "<udid>%s</udid><sequenceid>%s</sequenceid><installnum>%s</installnum>", 
pMe->g_NavRegisterInfo.szIMEINum, pMe->g_NavRegisterInfo.szSerialNum, pMe->g_NavRegisterInfo.szSetupNum );
NavLog( "pRequestBody:[%s] \n", pRequestBody );

navi_sprintf( pMe->g_pszPostData, "%s%s%s%s%s%s%s", szResquestHead1, szCode, szResquestHead2, szProcessTime, 
szResquestHead3, pRequestBody, szResquestTail );

if ( pRequestBody != NULL )
{
navi_free( pRequestBody );
pRequestBody = NULL;
}

return 1;
}

//判断是否连接超时
void NH_CheckConnectTimeOut( void *po )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE();
if ( pMe->g_bIsRespSuccess !=1 )
{
NavLog( "NH_CheckConnectTimeOut TimeOut!! \n" );
NavPrompt("网络超时,请稍后重试", -1, NULL );
NavRepaint( pMe );

CALLBACK_Cancel( &pMe->g_WebCallBack );
NavCancelTimer( NH_CheckConnectTimeOut );
}
}

//开始激活
int NH_WebStart( )
{
CGPSApp *pMe = (CGPSApp*)GETAPPINSTANCE( );
int nRet = -1;
char szDataPath[256] = {0};
//服务器地址
pMe->g_pszUrl = STRDUP( REGISTERADDRESS );
//计算安装码
nRet = NH_GetInstallCode( );
if ( nRet == 0 )
return 0;

//请求内容
NH_WebRequestXMLData();
NavLog("pMe->g_pszPostData:[%s]\n", pMe->g_pszPostData );

//参数设置
//  nRet = NH_AddWebOpt();
//  if ( nRet == 0 )
//  return 0;

// if there's post data, construct a stream for IWeb to consume
if ((char *)0 != pMe->g_pszPostData)
{
if (SUCCESS == 
ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOURCEUTIL, 
(void **)&pMe->g_pISourceUtil)) 
{

ISOURCEUTIL_PeekFromMemory( pMe->g_pISourceUtil, (void*)pMe->g_pszPostData, 
navi_strlen(pMe->g_pszPostData)+1, NULL, NULL,
&pMe->g_pIPeek ); //此函数用于生成从内存块获取数据的新 ISource 接口对象。
ISOURCEUTIL_Release( pMe->g_pISourceUtil);
}
   }

    //设置接收响应的回调
CALLBACK_Init( &pMe->g_WebCallBack, NH_WebRespCallBack, pMe );

NavLog( "URL: %s\n", pMe->g_pszUrl );

//真机才有必要设置代理
#ifdef NAV_DEVICE
NavLog( "URL: %s\n", pMe->g_pszUrl );
IWEB_GetResponse(pMe->g_pIWeb,
(pMe->g_pIWeb, &pMe->g_pIWebResp, &pMe->g_WebCallBack, pMe->g_pszUrl, 
WEBOPT_HEADER, "accept: text/html,image/jpeg, */*\r\nContent-type:application/x-www-form-urlencoded\r\nX-Method: POST\r\n", /* for kicks */
WEBOPT_METHOD, "POST",
WEBOPT_HEADERHANDLER, NH_WebHeader,
WEBOPT_STATUSHANDLER, NH_WebStatus,
WEBOPT_PROXYSPEC, "http:///http://10.0.0.200:80",
WEBOPT_BODY, pMe->g_pIPeek,
WEBOPT_CONTENTLENGTH, navi_strlen(pMe->g_pszPostData)+1,
WEBOPT_END)); 
#else
NavLog( "URL: %s\n", pMe->g_pszUrl );
IWEB_GetResponse(pMe->g_pIWeb,
(pMe->g_pIWeb, &pMe->g_pIWebResp, &pMe->g_WebCallBack, pMe->g_pszUrl, 
WEBOPT_HEADER, "accept: text/html,image/jpeg, */*\r\nContent-type:application/x-www-form-urlencoded\r\nX-Method: POST\r\n", /* for kicks */
WEBOPT_METHOD, "POST",
WEBOPT_HEADERHANDLER, NH_WebHeader,
     WEBOPT_STATUSHANDLER, NH_WebStatus,
WEBOPT_BODY, pMe->g_pIPeek,
WEBOPT_CONTENTLENGTH, STRLEN(pMe->g_pszPostData)+1,
WEBOPT_END)); 
#endif
    
// MSLEEP(100);
//设置定时器判断是否连接超时
NavLog( "NH_CheckConnectTimeOut Set!!! \n" );
NavAddTimer( pMe, 20000, NH_CheckConnectTimeOut, pMe );
return 1;

}

--------------------编程问答-------------------- --------------------编程问答-------------------- 在C网的手机上才需要设定代理
补充:移动开发 ,  Brew
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,