找回密码
 注册
搜索
查看: 1088|回复: 9

[资料] MTK平台和互联网通信方法

[复制链接]
发表于 2007-12-3 11:52:23 | 显示全部楼层 |阅读模式
最近在MTK 6225平台上用SOCKET方式和互联网通讯,当执行连接函数时,始终返回-2(SOC_WOULDBLOCK)错误。请路过的兄弟指点指点。是否在创建SOCKET前还要进行一些别的初始化才能正常和互联网通讯
{
kal_int8 handle, result, i = 0;
kal_uint8 option;
sockaddr_struct  addr;
S32 len;
U8 buf[200], buf1[200];
while(i++ < 10)
{
    handle = soc_create(PF_INET, SOCK_STREAM, 0, MOD_MMI, 10);//z 10);
    if (handle < 0)
    {
         soc_close((kal_int8) handle);
     sprintf((S8*)buf1, (const char*)"create = %d, error.", handle);
     asciitounicode((S8*)buf1, (S8*)buf);
     DisplayPopup((U8*)buf, IMG_GLOBAL_ERROR, 1, 1000, 20);
//     return;
    }
//    sprintf((S8*)buf1, (const char*)"socket id = %d", handle);
//    asciitounicode((S8*)buf1, (S8*)buf);
//    DisplayPopup((U8*)buf, IMG_GLOBAL_OK, 1, 1000, 20);
//    result = soc_getsockopt(handle, SOC_NBIO, &option, sizeof(kal_uint8));
//    option = result;
    option  = KAL_TRUE;
    result  = soc_setsockopt(handle, SOC_NBIO, &option, sizeof(kal_uint8));
    if (result != SOC_SUCCESS)
    {
         soc_close((kal_int8) handle);
     sprintf((S8*)buf1, (const char*)"SOC_NBIO = %d, error.", result);
     asciitounicode((S8*)buf1, (S8*)buf);
     DisplayPopup((U8*)buf, IMG_GLOBAL_ERROR, 1, 1000, 20);
//         return;
    }
    option    = SOC_READ | SOC_WRITE | SOC_ACCEPT | SOC_CONNECT | SOC_CLOSE;
    result   = soc_setsockopt(handle, SOC_ASYNC, &option, sizeof(kal_uint8));
   
    if (result != SOC_SUCCESS)
    {
         soc_close((kal_int8) handle);
     sprintf((S8*)buf1, (const char*)"SOC_ASYNC = %d, error.", result);
     asciitounicode((S8*)buf1, (S8*)buf);
     DisplayPopup((U8*)buf, IMG_GLOBAL_ERROR, 1, 1000, 20);
//         return;
    }
    addr.addr[0] = 221;//z 110;
    addr.addr[1] = 212;//z 125;
    addr.addr[2] = 125;//z 212;
    addr.addr[3] = 110;//z 221;
    addr.addr[4] = 0;
    addr.addr_len = 4;
    addr.port = 2020;
    result = soc_connect((kal_int8) handle, (sockaddr_struct*)&addr);

    if (result == SOC_SUCCESS)
    {
     len = Int16ToChat("FFFF56333010190001020657045522785126293702000034650951203480", (char *)buf);
     result = soc_send(handle, buf, len, 0);
     if(result == len)
     {
      asciitounicode("Success", (S8*)buf);
      DisplayPopup((U8*)buf, IMG_GLOBAL_OK, 1, 1000, 20);
      return;
     }
     else
     {
          soc_close((kal_int8) handle);
      sprintf((S8*)buf1, (const char*)"send = %d, error.", result);
      asciitounicode((S8*)buf1, (S8*)buf);
      DisplayPopup((U8*)buf, IMG_GLOBAL_ERROR, 1, 1000, 20);
     }
//     return;
    }
    else
    {
/*     if(result == SOC_WOULDBLOCK)
     {
      len = Int16ToChat("FFFF56333010190001020657045522785126293702000034650951203480", (char *)buf);
      result = soc_send(handle, buf, len, 0);
      if(result == len)
      {
       asciitounicode("Success", (S8*)buf);
       DisplayPopup((U8*)buf, IMG_GLOBAL_OK, 1, 1000, 20);
      }
      else
      {
       sprintf((S8*)buf1, (const char*)"send = %d, error.", result);
       asciitounicode((S8*)buf1, (S8*)buf);
       DisplayPopup((U8*)buf, IMG_GLOBAL_ERROR, 1, 1000, 20);
      }
     }
     else*/
     {
          soc_close((kal_int8) handle);
      sprintf((S8*)buf1, (const char*)"connect = %d, error.", result);
      asciitounicode((S8*)buf1, (S8*)buf);
      DisplayPopup((U8*)buf, IMG_GLOBAL_ERROR, 1, 1000, 20);
     }
//     return;
    }
    for(len = 0; len <2000000; len++);
}
}
发表于 2007-12-3 12:58:55 | 显示全部楼层
看一下你的GPRS设置是否有问题,是不是做证券之行?[em01]
点评回复

使用道具 举报

 楼主| 发表于 2007-12-3 13:35:59 | 显示全部楼层
谢谢兄弟回应,能否有更明确的指点?我不做证券,想用这种方式传一些短信等消息。我的MSN:asj_zhao@yahoo.com.cn。希望可以聊聊。
点评回复

使用道具 举报

发表于 2007-12-5 09:57:13 | 显示全部楼层
addr.addr[4]  是什么? (最好去掉)
真机 soc_create(PF_INET, SOCK_STREAM, 0, MOD_MMI, 10);
最后一个参数应为14. 模拟器随便,10就可以。
点评回复

使用道具 举报

 楼主| 发表于 2007-12-5 11:45:10 | 显示全部楼层
谢谢4楼的回复,我将soc_create的最后一个参数改为了14,但是连接还是返回-2错误。但屏幕上显示“G”,表明GPRS连通了。还有其他提示吗?谢谢热心的兄弟!!!
点评回复

使用道具 举报

发表于 2007-12-5 17:26:23 | 显示全部楼层
你设置了异步非阻塞方式。
当调用soc_connect函数时,如果距离过远,会返回-2,表明连接处于处理过程。你得注册回调函数
result = soc_connect((kal_int8) handle, (sockaddr_struct*)&addr);
if(result == -2)
SetProtocolEventHandler(lyc_socket_notify,MSG_ID_APP_SOC_NOTIFY_IND);

当连接成功后。 soc会向你的应用层发消息。执行回调函数
void lyc_socket_notify(void* msg)
{
           app_soc_notify_ind_struct *soc_notify = (app_soc_notify_ind_struct*)msg;

        switch(soc_notify->event_type)
        {
        case SOC_WRITE:
                {
                        lyc_send_request();
                        break;
                }
        case SOC_READ:
                {
                        lyc_recv_response();
                        break;
                }
        case SOC_CONNECT:
                {
                        if(soc_notify->result == KAL_TRUE)    这里代表连接成功
                        {
                                                        //执行你的发送函数
                                lyc_send_request();
                        }
                        else
                        {                       
                                lyc_close_socket();
                        }
                        break;
                }
        case SOC_CLOSE:
                {
                                      soc_close();
                        break;
                }
        default:
                {
                        lyc_close_socket();
                        break;
                }
}

异步非阻塞socket你没学过吗?
点评回复

使用道具 举报

发表于 2007-12-5 17:59:59 | 显示全部楼层
学习!
点评回复

使用道具 举报

 楼主| 发表于 2007-12-6 10:06:35 | 显示全部楼层
谢谢兄弟指点!!!
点评回复

使用道具 举报

 楼主| 发表于 2007-12-27 16:51:58 | 显示全部楼层
请路过的达人能给予指点一下原因,兄弟在Socket连接时始终返回-2(SOC_WOULDBLOCK)。先谢谢了!!!
点评回复

使用道具 举报

发表于 2007-12-28 09:30:11 | 显示全部楼层
我也想知道一下,那位大哥能帮忙解释一下?
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

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

GMT+8, 2024-11-20 20:25 , Processed in 0.051093 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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