在非 MMI task, socket 回调函数执行不...

wangou42 2011-09-16 05:23:38
在 MMI task,程序一切正常,可以 send, recv。
在我自己写的一个 task 内,可以 connect,之后,遇到 SOC_WOULDBLOCK 并注册回调函数,回调函数一直没有响应。自定义的 task 没有收到 MSG_ID_APP_SOC_NOTIFY_IND 消息,却收到了 MSG_ID_APP_SOC_BEARER_INFO_IND 消息。
有没有谁遇到类似的问题啊?我是新手,请多多指教。


代码是在网上搜索的获取天气的:

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);
}
}
...全文
192 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaokui_hyz 2012-05-31
  • 打赏
  • 举报
回复
有没有执行这get_network_time_socket_notify(void *msg_ptr)函数呀
xinyuiancai 2011-09-21
  • 打赏
  • 举报
回复
好像都没人来看的....
wangou42 2011-09-21
  • 打赏
  • 举报
回复
socket 似乎只能在 MMI 线程里面跑啊
wangou42 2011-09-16
  • 打赏
  • 举报
回复
在我自己的 task 内,get_network_time_socket_notify 永远不会被调用,在 MMI task 内就没有问题。

不知道在 task 主函数里是不是需要相应处理?

wangou42 2011-09-16
  • 打赏
  • 举报
回复
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;
}
}

790

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 其他移动相关
社区管理员
  • 移动开发其他问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧