找回密码
 注册
搜索
查看: 1842|回复: 18

[讨论] mtk的socket高手帮我看看

[复制链接]
发表于 2008-10-15 15:25:28 | 显示全部楼层 |阅读模式
#include "Soc_api.h"
#include "String.h"
#include "Med_utility.h"
#include "Soc_consts.h"
#include "Kal_trace.h"
#include "App2soc_struct.h"
#include "ProtocolEvents.h"

//#define URL "GET /lenovo/data/mobile/test_zlib/contents.meta HTTP/1.1\nX-ONLINE-HOST:221.223.53.34:80\n\r\n"

#define URL "GET /index.html HTTP/1.1\nHOST:10.0.0.172:80\n\r\n"

#define BUF_SIZE 2*1024

#define MAX_RCV_BUF_SIZE 1000

kal_uint8 *buf;

kal_int8 socket_id=-1;

sockaddr_struct address;

kal_int8 length=0;

void socket_send(void);

void socket_receive(void);

void socket_close(void);

//void soc_close_nwk_account(kal_uint16 mod_id);

void socket_notify(void *message);
/*========================================================*/


void TbmPly_enter_app(void)
{
  kal_uint8 val=KAL_TRUE;

  kal_int8 ret;
  
  buf=med_alloc_ext_mem(BUF_SIZE);
  if(buf==NULL)
          {
          kal_print("buf malloc error!");
        return;
          }

  socket_id=soc_create(SOC_PF_INET, SOC_SOCK_STREAM, 0, MOD_MED, 14);
  if(socket_id<0)
          {
          kal_print("socket create erroe!\n");
        med_free_ext_mem((void **)&buf);
        return;
          }

  if(soc_setsockopt(socket_id, SOC_NBIO, &val, sizeof(val))<0)
          {
          kal_print("set socket nonblock mode error!");
        med_free_ext_mem((void **)&buf);
        return;
          }

  val=SOC_READ | SOC_WRITE | SOC_CLOSE | SOC_CONNECT;

  if(soc_setsockopt(socket_id, SOC_ASYNC, &val, sizeof(val))<0)
          {
          kal_print("set socket asychronize mode error!");
        med_free_ext_mem((void **)&buf);
        return;
          }
       
  kal_print("socket create ok!\n");

  address.addr[0]=172;
  address.addr[1]=0;
  address.addr[2]=0;
  address.addr[3]=10;
  address.addr_len=4;
  address.port=80;
  address.sock_type=SOC_SOCK_STREAM;
  
  kal_prompt_trace(MOD_WAP, "start connect:%d.%d.%d.%d port:%d\n",
          address.addr[0],address.addr[1],address.addr[2],
          address.addr[3],address.port);

  ret=soc_connect(socket_id, (sockaddr_struct *)&address);

  kal_prompt_trace(MOD_WAP, "connect result:%d", ret);

  if(ret==SOC_SUCCESS)
          {
          kal_prompt_trace(MOD_WAP, "connect server success!");

        socket_send();
          }

  else if(ret==SOC_WOULDBLOCK)
          {
          SetProtocolEventHandler(socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);
        return;
          }

  else
          {
          if(ret==SOC_ERROR)
                  {
                  kal_prompt_trace(MOD_WAP, "connect host fail!");
                socket_close();
                return;
                  }

        return;
          }

  return;
}


void socket_send(void)
{
  kal_int32 result;

  kal_print("start send!\n");

  result=soc_send(socket_id, URL, strlen(URL), 0);

  kal_prompt_trace(MOD_WAP, "send result:%d\n", result);

  if(result>0)
          {
          socket_receive();
        return;
          }

  else
          {
          if(result==SOC_WOULDBLOCK)
                  {
                  SetProtocolEventHandler(socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);
                return;
                  }

        else
                {
                if(result==SOC_ERROR)
                        {
                        socket_close();
                        return;
                        }

                else
                        {
                        socket_close();
                        return;
                        }
                }
          }
}


void socket_receive(void)
{
  kal_int32 result;

  kal_uint8 rbuf[MAX_RCV_BUF_SIZE];

  kal_print("start receive!\n");

  do{

  result=soc_recv(socket_id, rbuf, MAX_RCV_BUF_SIZE, 0);

  kal_prompt_trace(MOD_WAP, "receive result:%d\n", result);

  if(result>0)
          {
          kal_prompt_trace(MOD_WAP,"%s", rbuf);
        memcpy((kal_uint8 *)(buf+length), rbuf, result);
        length+=result;

        memset(rbuf, 0, MAX_RCV_BUF_SIZE);
          }

          }while(result>0);

  if(result==0)
          {
          kal_prompt_trace(MOD_WAP, "receive over!");
        SetProtocolEventHandler(socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);
        return;
          }

  if(result==SOC_WOULDBLOCK)
          {
          SetProtocolEventHandler(socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);
        return;
          }

  else
          {
          socket_close();
          }

  return;
}


void socket_close(void)
{
  kal_print("start close!\n");

  med_free_ext_mem((void *)&buf);

  soc_close(socket_id);

  //soc_close_nwk_account(MOD_WAP);

  kal_print("close ok!\n");
  return;
}

/*
void soc_close_nwk_account(kal_uint16 mod_id)
{
  return;
}
*/

void socket_notify(void *message)
{
  app_soc_notify_ind_struct *soc_notify=(app_soc_notify_ind_struct *)message;

  kal_prompt_trace(MOD_WAP, "start socket notify!\n");

  if(soc_notify->socket_id != socket_id)
          {
          kal_print("no socket!\n");
        return;
          }

  kal_prompt_trace(MOD_WAP, "event type:%d,result:%d\n", soc_notify->event_type,soc_notify->result);

  switch(soc_notify->event_type)
          {
          case SOC_CONNECT:
                {
                if(soc_notify->result == KAL_TRUE)
                        {
                        kal_print("socket connect ok!\n");
                        socket_send();
                        }

                else
                        socket_close();

                break;
                  }

        case SOC_WRITE:
                {
                socket_send();
                break;
                }

        case SOC_READ:
                {
                socket_receive();
                break;
                }

        case SOC_CLOSE:
                {
                if(socket_id>=0)
                        socket_close();
                break;
                }

        default:
                {
                socket_close();
                break;
                }
          }
}




调试的时候soc_connect的返回值为-2,但是回调函数一直没有响应,这是什么问题?
 楼主| 发表于 2008-10-16 08:54:05 | 显示全部楼层
[em03]
没有人回答,自己顶一下!
点评回复

使用道具 举报

发表于 2008-10-16 14:15:09 | 显示全部楼层
-2是异步连接状态,看GPRS打开没。
点评回复

使用道具 举报

 楼主| 发表于 2008-10-16 16:25:30 | 显示全部楼层
要加程序打开GPRS么?
点评回复

使用道具 举报

 楼主| 发表于 2008-10-16 16:28:01 | 显示全部楼层
手机上的现象是出现图标"G"几秒钟后就消失了!
点评回复

使用道具 举报

发表于 2008-10-16 16:51:39 | 显示全部楼层
一般是这样的 走cmwap   soc_connect之后,下发消息,通知abm打开gprs然后,走到中国移动网关,也就是10.0.0.172,然后发回通知,你接到连接后,就在notify函数里面收到SOC_CONNECT消息了。紧接着,你就可以向指定的ip地址发东西了,比如在你例子中GET数据的地址 221.223.53.34
这个GET /index.html HTTP/1.1\\nHOST:10.0.0.172:80\\n\\r\\n 好像不对,因为中国移动网关没index.html这个东西吧(猜测)。
你这里
  address.addr[0]=172;
  address.addr[1]=0;
  address.addr[2]=0;
  address.addr[3]=10;
你这里地址反了吧。
点评回复

使用道具 举报

 楼主| 发表于 2008-10-16 17:48:42 | 显示全部楼层
我GET命令用了这个:
#define URL "GET /lenovo/data/mobile/test_zlib/contents.meta HTTP/1.1\\nX-ONLINE-HOST:221.223.53.34:80\\n\\r\\n"

地址反回来了,还是一样;

socket_notify这个函数里面的打印信息始终看不到;
但是在连接函数的SetProtocolEventHandler(socket_notify, MSG_ID_APP_SOC_NOTIFY_IND);后面加打印信息就可以打印;
很奇怪啊~
点评回复

使用道具 举报

发表于 2008-10-17 17:06:40 | 显示全部楼层
socket_id=soc_create(SOC_PF_INET, SOC_SOCK_STREAM, 0, MOD_MED, 14);
这句可能有问题,MOD_ID用mmi为好, account_ID是不是14;
在connect时会acctive account ,如果ID不正确connect时一定会失败。
点评回复

使用道具 举报

发表于 2008-10-17 17:07:41 | 显示全部楼层
建议打开mod_tcpip及mod_socket看一下log
点评回复

使用道具 举报

发表于 2008-10-17 17:08:21 | 显示全部楼层
[em02]
点评回复

使用道具 举报

 楼主| 发表于 2008-10-20 12:36:20 | 显示全部楼层
[em01]
回调函数可以用了!
错误是soc_bearer_fail
点评回复

使用道具 举报

发表于 2008-10-20 19:50:02 | 显示全部楼层
楼主,已经调试成功了吗?
能否把这个实例发给我呢,谢谢咯!

slmyj1015@126.com

另外,还想再请教下,服务器上放的是什么格式的内容?
点评回复

使用道具 举报

 楼主| 发表于 2008-10-21 13:54:30 | 显示全部楼层
还没有,
soc_bearer_fail

就是下文件!
点评回复

使用道具 举报

发表于 2008-10-22 15:31:09 | 显示全部楼层
楼主,
http://221.223.53.34:80/lenovo/data/mobile/test_zlib/contents.meta
文件里面的内容读取到 rbuf 中吧?呵呵,我也想做出这种效果来。

恩,MTK工程模式下有个例子也可参考看下。
点评回复

使用道具 举报

发表于 2009-6-7 15:00:14 | 显示全部楼层
楼主:
   您好!您已经调好了吗?
   我正在弄SOCKET,能把这个实例发个给我吗?
   谢谢!
   zhudaode@163.com
   万分感谢!
点评回复

使用道具 举报

发表于 2009-6-7 21:55:32 | 显示全部楼层
看看sim还有钱没有
点评回复

使用道具 举报

发表于 2009-6-8 00:33:02 | 显示全部楼层
学习中。。。。
点评回复

使用道具 举报

发表于 2009-10-14 20:38:44 | 显示全部楼层
楼主:
   您好!能把这个实例发个给我吗?我现在也在做这样的一个程序。
   谢谢!
   shi_xiangjun@163.com
   万分感谢!欢迎到深圳玩。[em08]
点评回复

使用道具 举报

发表于 2009-10-23 00:20:15 | 显示全部楼层
如果是soc_bearer_fail这个错误的话,应该是account_ID不对,如果不知道怎么看account_ID,就看看wap浏览器的trace吧,创建socket时会有这个值的
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

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

GMT+8, 2025-2-25 15:10 , Processed in 0.048301 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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