MTK socket 小结 3

来源:互联网 发布:制作视频配音软件 编辑:程序博客网 时间:2024/06/07 02:10

昨天说了下socket基本几个函数,还有常用的是域名解析函数。

// 通过域名获得ip地址 // is_blocking,是否阻塞,现在只支持none block,也最好用none block // mod_id 如果没有立即获得,那么当查询成完毕,将向该mod 发送消息 // request_id 区分不同的DNS 查询结果。比如在同时查询两个以上,在返回的消息中,就可以通过id来进行区分,这个结果是哪一个查询结果 // addr 如果直接查询到结果,比如命中cache,那么ip地址直接返回 // len 返回的ip地址长度 // access_id 也存放在查询返回消息里面,但不知具体什么用 // nwk_account_id 接入点 kal_int8 soc_gethostbyname(kal_bool is_blocking,                            module_type     mod_id,                            kal_int32       request_id,                            const kal_char  *domain_name,                            kal_uint8       *addr,                            kal_uint8       *addr_len,                            kal_uint8       access_id,                            kal_uint32      nwk_account_id);

 

接下来具体分析一个例子,socket 例子MTK,自带了一个,在EngineerModeSrc.c 和 EngineerModeSocketDemoApp.c 里,里面有好几个socket使用的例子,DNS,ECHO,DAYTIME,TRACERT。文件 EngineerModeSrc.c 里面主要是界面显示逻辑,EngineerModeSocketDemoApp.c  里面是真正的socket 逻辑代码。

在 EngineerModeSrc.c 里面,选择了相应的选项后,最终会走到函数 EntryEmSocketInProgress 显示正在进行网络连接的界面,它调用 EmSocketSendReq 函数 来简单区分,是选择了哪种应用。EmSocketSendReq  根据相关选择信息,调用mmi_soc_demo_app_request进行真正的socket处理。

// 这个函数主要是主要是根据不同配置,初始化全局信息。 // app_id, 是哪一种操作 NDS,HTTP等等 // account_id , grps 帐户id // server_ip_address ip地址 // url url 地址,根据不同类型,确定使用ip地址还是url // echo_txt ,如果是 ECHO,这个表示要发送的内容 // callback 操作的回调函数 int mmi_soc_demo_app_request(         mmi_soc_demo_app_enum app_id,         int account_id,         char server_ip_address[4],         char *url,         int url_len,         char *echo_text,         int echo_text_len,         mmi_soc_demo_app_rsp_t callback) {         // soc_demo_transaction 是一个全局变量,存放当前信息     // 判断是否有连接正在进行     if (soc_demo_transaction)     {         kal_print("Transaction existed!!");         return EN_SOC_BUSY;     }     else     {         // 分配内存,如果出错调用 en_soc_output_result 通知注册的函数         // 同时释放相应内存,防止泄露。         if ((soc_demo_transaction = OslMalloc(sizeof(soc_demo_app_transaction_struct))) == NULL)         {             kal_print("No memory");             en_soc_output_result(EN_SOC_NO_MEMORY, NULL, 0);             return EN_SOC_NO_MEMORY;         }         else         {            // 分配收发内容的buffer             memset(soc_demo_transaction, 0, sizeof(soc_demo_app_transaction_struct));             if ((soc_demo_transaction->rcvd_buffer = OslMalloc(MAX_RCV_BUFFER_SIZE)) == NULL)             {                 kal_print("No memory");                 en_soc_output_result(EN_SOC_NO_MEMORY, NULL, 0);                 return EN_SOC_NO_MEMORY;             }             else             {                 if ((soc_demo_transaction->snd_buffer = OslMalloc(MAX_SND_BUFFER_SIZE)) == NULL)                 {                     kal_print("No memory");                     en_soc_output_result(EN_SOC_NO_MEMORY, NULL, 0);                     return EN_SOC_NO_MEMORY;                 }                 else                 {                     /* Set initial values to soc_demo_transaction */                     memset((kal_int8*) soc_demo_transaction->rcvd_buffer, 0, MAX_RCV_BUFFER_SIZE);                     memset((kal_int8*) soc_demo_transaction->snd_buffer, 0, MAX_SND_BUFFER_SIZE);                     //计算接入点,具体下次分析                     account_id = cbm_encode_app_id_data_account_id(account_id, app_id);                     soc_demo_transaction->soc_demo_app_id = app_id;                     soc_demo_transaction->nwt_acount_id = account_id;                     // 保存相应信息                     if (server_ip_address)                     {                         memcpy(soc_demo_transaction->server_ip_addr.addr, server_ip_address, 4);                         soc_demo_transaction->server_ip_addr.addr_len = 4;                     }                     soc_demo_transaction->url = (kal_int8*) url;                     soc_demo_transaction->url_len = url_len;                     soc_demo_transaction->snd_counter = 0;                     soc_demo_transaction->rcvd_counter = 0;                     soc_demo_transaction->callback = callback;                     if (echo_text)                     {                         if (echo_text_len > MAX_SND_BUFFER_SIZE)                         {                             memcpy(soc_demo_transaction->snd_buffer, echo_text, MAX_SND_BUFFER_SIZE);                             soc_demo_transaction->snd_data_len = MAX_SND_BUFFER_SIZE;                         }                         else                         {                             memcpy(soc_demo_transaction->snd_buffer, echo_text, echo_text_len);                             soc_demo_transaction->snd_data_len = echo_text_len;                         }                          OslMfree(echo_text);                     }                     if (en_soc_demo_app_create_socket() == KAL_FALSE)                     {                         en_soc_output_result(EN_SOC_NO_MEMORY, NULL, 0);                         return EN_SOC_NO_MEMORY;                     }                     // 根据不同id,进行操作                     switch (app_id)                     {                         case HTTP:                         {                             soc_demo_transaction->state = HTTP_DNS_QUERY;                             return en_soc_demo_http_send_request();                         }                         case DNS:                         {                             (void)en_soc_demo_get_host_by_name(DNS, (kal_uint8*) soc_demo_transaction->url);                             return EN_SOC_SUCCESS;                         }                         case DAYTIME:                         {                             soc_demo_transaction->server_ip_addr.port = SOC_DAYTIME_RESVD_PORT;                             soc_demo_transaction->snd_data_len = 10;    /* garbage data */                             return en_soc_demo_udp_app_send_request();                         }                         case ECHO:                         {                             soc_demo_transaction->server_ip_addr.port = SOC_ECHO_RESVD_PORT;                             return en_soc_demo_udp_app_send_request();                         }                         case TRACERT:                         {                             if (em_soc_icmp_init_soc() < 0)                             {                                 return EN_SOC_ERROR;                             }                                                          memset(soc_demo_transaction->server_ip_addr.addr,0,MAX_SOCK_ADDR_LEN);                             if (                                 em_soc_demo_app_get_addr_type((kal_uint8*)url, url_len, soc_demo_transaction->server_ip_addr.addr)                                 == SOC_ADDR_TYPE_DNAME )                             {                                 soc_demo_transaction->state = HTTP_DNS_QUERY;                                 en_soc_demo_get_host_by_name(TRACERT, (kal_uint8*)soc_demo_transaction->url);                                 return EN_SOC_SUCCESS;                             }                             else                             {                                 char str[64];                                 memset(str,0,64);                                 kal_sprintf(                                     str,                                     " %d.%d.%d.%d\n",                                     soc_demo_transaction->server_ip_addr.addr[0],                                     soc_demo_transaction->server_ip_addr.addr[1],                                     soc_demo_transaction->server_ip_addr.addr[2],                                     soc_demo_transaction->server_ip_addr.addr[3]                                 );                                 EmStartTraceRtResult(str);                                 soc_demo_transaction->state = REQ_SENT;                                 StartTimer(EM_GPRS_SOC_DEMO_APP_TIMER, SOC_DEMO_APP_POST_TIMEOUT, em_soc_icmp_timer_hdlr);                                 em_soc_icmp_send_hdlr(SOC_ICMP_SEND_NORMAL);                                 return EN_SOC_SUCCESS;                             }                         }                         default:                         {                             en_soc_output_result(EN_SOC_UNKNOWN_APP, NULL, 0);                             return EN_SOC_UNKNOWN_APP;                         }                      }                 }              }         }     } }
转自:
http://blog.csdn.net/yanwuxufeng/archive/2010/09/07/5867693.aspx
原创粉丝点击