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