找回密码
 注册
搜索
查看: 1174|回复: 5

[资料] 求教:在非 MMI task, socket 回调函数执行不了

[复制链接]
发表于 2011-9-16 17:13:49 | 显示全部楼层 |阅读模式
在 MMI task,程序一切正常,可以 send, recv。
在我自己写的一个 task 内,可以 connect,之后,遇到 SOC_WOULDBLOCK 并注册回调函数,回调函数一直没有响应。自定义的 task 没有收到 MSG_ID_APP_SOC_NOTIFY_IND 消息,却收到了 MSG_ID_APP_SOC_BEARER_INFO_IND 消息。
有没有谁遇到类似的问题啊?我是新手,请多多指教。
 楼主| 发表于 2011-9-16 17:23:42 | 显示全部楼层
不知道在 task 主函数里是不是需要相应处理?
点评回复

使用道具 举报

 楼主| 发表于 2011-9-16 17:21:16 | 显示全部楼层
在我自己的 task 内,get_network_time_socket_notify 永远不会被调用,在 MMI task 内就没有问题。
点评回复

使用道具 举报

 楼主| 发表于 2011-9-16 17:17:52 | 显示全部楼层
void get_network_time_socket_receive(void)
{
       const unsigned char utf8_head[2]={"|\0"};
       const unsigned char href[7]={"href=\"\0"};
       unsigned char buf[SOCKET_BUF_SIZE];
       unsigned char wbuf[SOCKET_BUF_SIZE*2];
       unsigned char *temp_ptr;
       int offset;
       int soc_ret;

       memset(buf, 0, sizeof(buf));
       soc_ret = soc_recv(g_weather_soc_id, buf, sizeof(buf), 0);
       if(soc_ret > 0)
       {
              buf[SOCKET_BUF_SIZE-2] = '\0';
              buf[SOCKET_BUF_SIZE-1] = '\0';

              #if 0
              {
                     unsigned int write_len;
                     int file_ret;
                     FS_HANDLE file_handle;
                     file_handle = FS_Open((WCHAR*)L"C://weather101.txt", FS_CREATE_ALWAYS);
                     file_ret = FS_Write(file_handle, buf, sizeof(buf), &write_len);
                     FS_Close(file_handle);
              }
              #endif

#if 0
              offset=mmi_ucs2_strstr(buf, (unsigned char *)utf8_head);
              if(offset>0)
              {
                     temp_ptr = buf;
                     offset++;
                     temp_ptr += offset;
                     offset = mmi_utf8_to_unicode(temp_ptr, g_weather_temperature);
                     kal_printf(g_weather_temperature);
                     soc_close(g_weather_soc_id);
                     return;
              }

              offset=mmi_ucs2_strstr(buf, (unsigned char *)href);//the html had move,cennect again
              if(offset>0)
              {
                     get_network_time_socket_send();
                     return;
              }
              else
              {
                     kal_printf("received error!wait a minute and try again.");
                     soc_close(g_weather_soc_id);
                     return;
              }
#endif
       }
       else if(soc_ret == SOC_WOULDBLOCK)
       {
                   kal_printf("MSG_ID_APP_SOC_NOTIFY_IND[%d]\n",MSG_ID_APP_SOC_NOTIFY_IND);
                   SetProtocolEventHandler(get_network_time_socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);
       }
}

void get_network_time_socket_notify(void *msg_ptr)
{
       app_soc_notify_ind_struct *soc_notify = (app_soc_notify_ind_struct *)msg_ptr;
       switch(soc_notify->event_type)
       {
              case SOC_READ:
                     get_network_time_socket_receive(); break;
              case SOC_WRITE:
                     get_network_time_socket_send(); break;
              case SOC_CONNECT:
                     get_network_time_socket_send(); break;
              case SOC_CLOSE:
                     break;
              default:
                     break;
       }
}
点评回复

使用道具 举报

 楼主| 发表于 2011-9-16 17:17:26 | 显示全部楼层
代码是在网上搜索的获取天气的:

unsigned char weather_URL[]={
        "GET http://61.135.159.21/cgi-bin/weather?0755 HTTP/1.1\r\n"
                "Host: 10.0.0.172:80\r\nUser-Agent: */*\r\nAccept:*/*\r\n"
                "X-Online-Host: 61.135.159.21\r\nProxy-Connection: Keep-Alive\r\n\r\n"};
        /*0755 深圳的区号,可以尝试用浏览器打开http://61.135.159.21/cgi-bin/weather?0755,会发生什么呢?*/
        //*{"GET http://www.google.com/ig/api?hl=zh_cn&weather=shenzhen HTTP/1.1\r\nHost:www.google.com:80\r\nUser-Agent: */*\r\nAccept:*/*\r\nX-Online-Host:www.weather.com.cn\r\nProxy-Connection: Keep-Alive\r\n\r\n"};这是谷歌的接口,shenzhen是城市*/
unsigned char weather_ip[]={"61.135.159.21"};




static kal_uint8 g_weather_soc_id;
static sockaddr_struct g_weather_ip_addr;
#define SOCKET_BUF_SIZE 1500

void get_network_time_socket_send(void);
void get_network_time_socket_receive(void);
void get_network_time_socket_notify(void *msg_ptr);

void mmi_get_network_time(void)
{
       kal_uint8 val;
       kal_int8 soc_ret;
           U8 emSocketAccountId = custom_get_csd_profile_num();

       #ifdef WIN32
       soc_init_win32();
       #endif

       // MOD_CH_NRT 是我的自定义的模块 ID,使用 MMI task 时改为 MOD_MMI
       g_weather_soc_id = soc_create(PF_INET, SOCK_STREAM, 0, MOD_CH_NRT, emSocketAccountId);
       if(g_weather_soc_id<0)
       {
              kal_printf("create socket, error!");
              return;
       }
       val = 1;
       if(soc_setsockopt(g_weather_soc_id, SOC_NBIO, &val, sizeof(val))<0)
       {
              kal_printf("set socket SOC_NBIO error!");
              soc_close(g_weather_soc_id);
              return;
       }

       val = SOC_READ|SOC_ASYNC|SOC_CLOSE|SOC_CONNECT;
       if(soc_setsockopt(g_weather_soc_id, SOC_ASYNC, &val, sizeof(val))<0)
       {
              kal_printf("set socket SOC_ASYNC error!");
              soc_close(g_weather_soc_id);
              return;
       }

       memset(&g_weather_ip_addr, 0, sizeof(sockaddr_struct));
       g_weather_ip_addr.addr[0] = 61;
       g_weather_ip_addr.addr[1] = 135;
       g_weather_ip_addr.addr[2] = 159;
       g_weather_ip_addr.addr[3] = 21;
       g_weather_ip_addr.addr_len = 4;
       g_weather_ip_addr.port = 80;
       g_weather_ip_addr.sock_type = SOCK_STREAM;

           SetProtocolEventHandler(get_network_time_socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);

       soc_ret = soc_connect(g_weather_soc_id, &g_weather_ip_addr);
       if(soc_ret>=0)
       {
              get_network_time_socket_send();
              return;
       }
       else if(soc_ret == SOC_WOULDBLOCK)
       {
              kal_printf("connect socket, wait...\n");
                          kal_printf("MSG_ID_APP_SOC_NOTIFY_IND[%d]\n",MSG_ID_APP_SOC_NOTIFY_IND);
              SetProtocolEventHandler(get_network_time_socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);
              return ;
       }
}

void get_network_time_socket_send(void)
{
       //unsigned char buf[200];
       unsigned char wbuf[400];
       kal_int32 ret,len;

       /*soc_getsockaddr(g_weather_soc_id, 1, & g_weather_ip_addr);
       sprintf((char *)buf, "IP:%d.%d.%d.%d,PORT:%d",
              g_weather_ip_addr.addr[0], g_weather_ip_addr.addr[1], g_weather_ip_addr.addr[2],g_weather_ip_addr.addr[3],  g_weather_ip_addr.port);
       app_asc_str_to_ucs2_str((kal_int8*)wbuf, (kal_int8 *)buf);
       kal_printf(wbuf);如果用另一台手机连接上这个IP,两者之间就可以发送数据,我用J2ME编一个程序放到手机上实现过,不知这里行不行?*/

              len = strlen(weather_URL);
              ret = soc_send(g_weather_soc_id, weather_URL, len, 0);

       if(ret > 0)
       {
              get_network_time_socket_receive();
       }
       else
       {
                   kal_printf("MSG_ID_APP_SOC_NOTIFY_IND[%d]\n",MSG_ID_APP_SOC_NOTIFY_IND);
              SetProtocolEventHandler(get_network_time_socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);
       }
}
点评回复

使用道具 举报

 楼主| 发表于 2011-9-22 14:58:03 | 显示全部楼层
貌似 socket 程序只能在 MMI 里跑啊!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2025-1-27 12:44 , Processed in 0.073621 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表