UDP接收不到
我看群里有人回答了,-2应该是阻塞了吧, 用notify注册回调函数啊。
用notify注册回调函数,就是收到READ事件时,调用回调函数,在回调函数里去读数据,add kal_sleep_task(x) ablove soc_read()后,不管等待多久还是返回-2,不知道问题在哪,
{
cbm_app_info_struct info;
lg_app_id=0;
nwk_account_id=0;
info.app_str_id=301;//lg EM_SOCKET_TEXT;
info.app_icon_id=111;//lg EM_SOCKET_ICON;
dbg_print("lg_myapp_apn_param.apn=%s\r\n",g_myapp_apn_param.apn);
if(strstr((const char *)g_myapp_apn_param.apn,(const char *)"wap"))
{
//info.app_type=0;//DTCNT_APPTYPE_EMAIL
info.app_type=DTCNT_APPTYPE_BRW_HTTP | DTCNT_APPTYPE_MRE_WAP | DTCNT_APPTYPE_DEF;
}
else
{
info.app_type=DTCNT_APPTYPE_BRW_HTTP | DTCNT_APPTYPE_EMAIL | DTCNT_APPTYPE_MRE_NET | DTCNT_APPTYPE_TETHERING | DTCNT_APPTYPE_PLAYER | DTCNT_APPTYPE_NTP | DTCNT_APPTYPE_PUSH; /* app type *///0;
}
ret=cbm_register_app_id_with_app_info(&info, &lg_app_id);
dbg_print("lg cbm_register_app_id_with_app_info=%d\r\n",ret);
if(ret == CBM_OK)
{
data_account= socket_get_acc_prof_id(g_myapp_apn_param, CBM_SIM_ID_SIM1);
dbg_print("lg data_account=%d\r\n",data_account);
ret=cbm_hold_bearer(lg_app_id);
dbg_print("lg cbm_hold_bearer=%d\r\n",ret);
nwk_account_id = cbm_encode_data_account_id(data_account, CBM_SIM_ID_SIM1, lg_app_id, KAL_FALSE);
dbg_print("lg nwk_account_id=%d\r\n",nwk_account_id);
}
else
{
// return FALSE;
}
#endif
for(i=0;i<=10;i++)//修改有时误发定位消息
{//修改有时误发定位消息
//2014y7m30 改为udp report_gps_soc_id = soc_create(SOC_PF_INET, SOC_SOCK_STREAM, 0/*IPPROTO_TCP*/, MOD_MMI, nwk_account_id);
report_gps_soc_id = soc_create(SOC_PF_INET, SOC_SOCK_DGRAM, 0/*IPPROTO_TCP*/, MOD_MMI, nwk_account_id);//2014y7m30 改为udp
dbg_print("lg soc_create=%d\r\n",report_gps_soc_id);
if(em_GpsPositionInquire_soc_id==report_gps_soc_id)//修改有时误发定位消息
{//修改有时误发定位消息
soc_close(report_gps_soc_id);//修改有时误发定位消息
}//修改有时误发定位消息
else
{
break;
}
}//修改有时误发定位消息
if(i>10)//修改有时误发定位消息
{//修改有时误发定位消息
dbg_print("lg lg_em_gps_open_soc Antisteal_reset_sytem\r\n");
//Antisteal_reset_sytem();//修改有时误发定位消息
soc_close(em_GpsPositionInquire_soc_id);//修改有时误发定位消息
em_GpsPositionInquire_soc_id=-1;//修改有时误发定位消息
//2014y7m30 改为udp report_gps_soc_id = soc_create(SOC_PF_INET, SOC_SOCK_STREAM, 0/*IPPROTO_TCP*/, MOD_MMI, nwk_account_id);
report_gps_soc_id = soc_create(SOC_PF_INET, SOC_SOCK_DGRAM, 0/*IPPROTO_TCP*/, MOD_MMI, nwk_account_id);//2014y7m30 改为udp
}//修改有时误发定位消息
/* set socket options */
//lg option = KAL_TRUE;
//lg soc_setsockopt(report_gps_soc_id , SOC_NBIO, &option, sizeof(option));
//lg option = SOC_READ|SOC_WRITE|SOC_CONNECT|SOC_CLOSE;
//lg soc_setsockopt(report_gps_soc_id, SOC_ASYNC, &option, sizeof(option));
option = SOC_READ | SOC_WRITE | SOC_ACCEPT | SOC_CONNECT | SOC_CLOSE;
//option = SOC_READ | SOC_WRITE | SOC_CLOSE;//2014y7m30 改为udp
ret = soc_setsockopt(report_gps_soc_id, SOC_ASYNC, &option, sizeof(option));
dbg_print("lg soc_setsockopt1=%d\r\n",ret);
//option = KAL_FALSE;
option = KAL_TRUE;
ret = soc_setsockopt(report_gps_soc_id, SOC_NBIO, &option, sizeof(option));
dbg_print("lg soc_setsockopt2=%d\r\n",ret);
ret=soc_connect(report_gps_soc_id,&soc_addr);
dbg_print("lg soc_connect=%d\r\n",ret);
#if 1//2014y7m30 改为udp
addr.sock_type = SOC_SOCK_DGRAM;
addr.addr_len = 0x04;
addr.port = 1024;//port;
addr.addr[0] = 0;
addr.addr[1] = 0;
addr.addr[2] = 0;
addr.addr[3] = 0;
ret = soc_bind(report_gps_soc_id,&addr);
dbg_print("lg soc_bind=%d\r\n",ret);
mmi_frm_set_protocol_event_handler(MSG_ID_APP_SOC_NOTIFY_IND, (PsIntFuncPtr)tcp_cb, MMI_TRUE);
}
tcp_cb中部分代码
switch (soc_notify->event_type)
{
case SOC_WRITE:
g_TCP_flag.TCP_is_connect=1;//?for test
break;
case SOC_READ:
/* Check if socket is ready for reading */
#if 1
/* Check if socket is ready for reading */
//is_ready = soc_ready_for_read(soc_notify->socket_id);
//dbg_print("lg SOC_READ is_ready=%d\r\n",is_ready);
//if(is_ready)
{
memset(recv_buffer, 0, sizeof(recv_buffer));
//ret = soc_recv(soc_notify->socket_id, (kal_uint8*) recv_buffer, sizeof(recv_buffer), 0);
kal_sleep_task(10000);
ret = soc_recvfrom(soc_notify->socket_id, (kal_uint8*) recv_buffer, sizeof(recv_buffer), 0,&soc_addr);
dbg_print("lg SOC_READ ret=%d\r\n",ret);
dbg_print("%s",recv_buffer);
if(ret>0)
{
// StopTimer(TCP_ReconnectTimer);
// g_TCP_flag.TCP_is_connect=1;
StopTimer(TCP_ReconnectTimer);
//这部分程序应该移到分析程序中去
RxHeartBeatAckTimeOutTimes=0;
StopTimer(TCP_HeartBeatWaitAckTimer);
// StartTimer(TCP_HeartBeatTimer,TCP_HeartBeat_Interval,Send_TCP_HeartBeat);//reset TCP_HeartBeatTimer as TCP_HeartBeat_Interval
// if(ret == strlen((char*)recv_buffer) )
// {
//dbg_print("lg1 %s",data_buf);
//
// }
// else
// {
//
// }
//添加GPRS 解析函数
AnalyseGprs(recv_buffer);
}
#if 0
//do{
ret = soc_recv(soc_notify->socket_id, (kal_uint8*) send_buffer, sizeof(send_buffer), 0);
dbg_print("lg SOC_READ ret=%d\r\n",ret);
dbg_print("%s",send_buffer);
//}while(ret==-2);
if(ret == strlen((char*)data_buf) )
{
dbg_print("lg1 %s",data_buf);
}
else
{
}
#endif
}
//else
//{
//}
#else
/* To test soc_recvmsg, change interface of test case 02 server */
//soc_recv(server_soc_id, (kal_uint8*) recv_buffer, 5, 0);
memset(&msghdr, 0, sizeof(soc_msghdr_struct));
iov.iov_buf = recv_buffer;
iov.iov_len = 5;
msghdr.iov = &iov;
msghdr.iov_num = 1;
do{
error = soc_recvmsg((kal_int8) soc_notify->socket_id, &msghdr, 0);
dbg_print("lg error=%d\r\n",error);
dbg_print("lg soc_recvmsg=%s\r\n",recv_buffer);
}while(error==-2);
if(error > 0)
{
}
else
{
}
#endif
break;
case SOC_CONNECT:
/* send data */
if(KAL_TRUE == soc_notify->result)
{
StopTimer(TCP_ReconnectTimer);
g_TCP_flag.TCP_is_connect=1;
//send_buffer[0]='#';
//memcpy(&send_buffer[1], "356823032255122", 15);
//send_buffer[]='#';
