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哈哈~ 谢谢