|
#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,但是回调函数一直没有响应,这是什么问题? |
|