微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > UDP接收不到

UDP接收不到

时间:10-02 整理:3721RD 点击:
有哪位高手解答下俺的问题,我mtk11B平台,UDP SOCKET上传到服务器很正常,可是接收收到READ事件后,用recvfROM函数去读数据就老是返回-2,这个如何解决呢

我看群里有人回答了,-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[]='#';

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top