#include
#include
#include
#include "msio.h"
#include "msgui.h"
#include "mschset.h"
#include "msstdlib.h"
#include "mssoc.h"
#include "msgui.h"
#include "mstimer.h"
#include "mslog.h"
#define IP_STR "211.143.108.24"
#define PORT 9876
//#define IP_STR "211.143.108.24"
//#define PORT 8102
char ip[4] = {127,0,0,1};
/* -----------------------------------------------------------------------
* 模块内部变量声明。
* ----------------------------------------------------------------------- */
int layer_hdl[1]; // 层数组,用于画布或字符的载体
struct ms_screeninfo scnifno; //获得屏幕信息
ms_sockaddr addr; //实例化结构体,用于初始化socket
/************************************************************************/
/* 函数声明 */
/************************************************************************/
/* 入口函数,应用初始化事件处理 */
int ms_init(void);
/* 应用中断事件处理函数 */
int ms_pause(void);
/* 应用恢复事件处理函数 */
int ms_resume(void);
/* 应用退出事件处理函数 */
int ms_finalize(void);
/* 按键弹起事件处理函数 */
void key_event_up(int param0);
/* 触屏释放动作事件处理函数 */
void pen_event_release(int param0,int param1);
/* --------------------------------------------------------------------------
* 回调函数声明。
* ----------------------------------------------------------------------- */
void soc_cb_action(int s, int e);
void bearer_cb_action(int event);
/* --------------------------------------------------------------------------
* 模块内部函数声明。
* ----------------------------------------------------------------------- */
void bearer_open_action(void);
int soc_send_action(int s); /* 发送函数 */
int soc_recv_action(int s); /* 接收函数 */
void key_pen_event(int code, int param0, int param1);
void sock_addr_action(void); /* 初始化函数 */
int soc_create_action(void); /* 创建套接字函数 */
void soc_connect_action(int s); /* 连接函数 */
static void draw_text(void); /* 显示不同的文字信息 */
//int ms_soc_recvfrom(int s, void * buf, int len, ms_sockaddr * addr);/* 接收函数 */
int soc_create_udp_action();//udp套接字声明
int soc_create_tcp_action();//tcp套接字声明
int timerid ; //定时器句柄
uint8* g_buf = NULL;
void timer_callback(int tid, int p);//定时器回调函数
char * g_temp = NULL;
int ms_init(void) /* 入口函数 */
{
int flag_vector;
ms_log_init("c:\\socdemo.log", 5);
ms_log_debug("ms_init\n\n");
g_temp = ms_calloc(10240);
timerid = -1 ;
//获取屏幕信息
if (ms_gui_get_screen_info(&scnifno) != MS_GDI_SUCCEED )
{
return MS_FAILED;
}
//创建层
layer_hdl[0] = ms_gui_create_layer(MS_BASE_LAYER, MS_BASE_LAYER);
ms_gui_set_layer_clip(layer_hdl[0],0,0,scnifno.width,scnifno.height);
flag_vector = ms_gui_is_use_vector_font();
//设置字体大小
ms_font_set_font_style(ms_gui_is_use_vector_font(),14,0,0,0);
/* 获得层缓冲区 */
g_buf = ms_gui_get_layer_buffer(layer_hdl[0]);
if(timerid == -1)
{
timerid = ms_create_timer(MS_TIMER_ACCURACY_HIGH);
ms_start_timer(timerid, 300, 0, timer_callback,1);
}
ms_soc_init();
bearer_open_action();
return MS_SUCCESS;
}
//键盘触屏输入输出事件
int ms_event(int code, int param0, int param1)
{
switch(code)
{
case MS_KEY_EVENT_UP:
key_event_up(param0);
break;
case MS_PEN_EVENT_RELEASE:
pen_event_release(param0, param1);
break;
}
return MS_SUCCESS;
}
/* 按键弹起事件处理函数 */
void key_event_up(int param0)
{
switch(param0)
{
case MS_KEY_NUM1:
{
//soc_create_action();
soc_create_tcp_action();
break;
}
case MS_KEY_RIGHT_SOFTKEY:
{
/* 应用主动退出 */
ms_exit();
break;
}
case MS_KEY_NUM0:
{
//TODO: 在此加入相应事件处理逻辑...
soc_create_udp_action();
break;
}
default:
break;
}
}
/* 触屏释放动作事件处理函数 */
void pen_event_release(int param0,int param1)
{
if ( param0>=200 && param0<=240 && param1>=300 && param1<=320 )
{
/* 应用主动退出 */
ms_exit();
}
}
int ms_pause(void) /* 中断 */
{
return 0;
}
int ms_resume(void) /* 激活 */
{
return 0;
}
int ms_finalize(void) /* 退出 */
{
ms_gui_free_layer(layer_hdl[0]);
/* 关闭网络传输设备 */
ms_bearer_close();
ms_soc_finalize();
return 0;
}
void bearer_open_action()
{
int ret;
ret = ms_bearer_open(0, (void*)bearer_cb_action); //正在打开网络设备接口
if (ret == MS_SOC_OK)
{
//执行socket操作
//soc_create_tcp_action()
}
else if (ret == MS_SOC_WAIT)
{
strcat(g_temp,"正在打开网络设备\n\n");
draw_text();
}
else
{
//错误处理
strcat(g_temp,"网络设备打开失败\n\n");
draw_text();
}
return ;
}
void soc_cb_action(int s, int e)
{
switch (e)
{
case MS_SOCEVT_CONNECT:
case MS_SOCEVT_WRITE:
soc_send_action(s); //开始发送数据
break;
case MS_SOCEVT_READ:
soc_recv_action(s); //开始接收数据
break;
case MS_SOCEVT_CLOSE:
case MS_SOCEVT_CONNECT_FAILED:
break; //错误处理或重连接
}
}
void bearer_cb_action(int event)
{
switch (event)
{
case MS_BEARER_OK:
//执行socket操作
strcat(g_temp,"网络设备打开成功\n\n");
draw_text();
//soc_create_tcp_action();
strcat(g_temp,"按1或0键开始创建套接字连接\n\n");
draw_text();
break;
case MS_BEARER_FAILED:
strcat(g_temp,"网络设备打开失败\n\n");
draw_text();
//错误处理
break;
}
}
void sock_addr_action()
{
//addr.addr="211.143.108.24";
ms_inet_addr(IP_STR, addr.addr);
addr.port = PORT;
}
//int soc_create_action()
int soc_create_tcp_action()//这个用来实现TCP
{
int s;
s = ms_soc_create(0, (void*)soc_cb_action); /* 由ms_soc_create_action函数创建函数套接字,成功返回句柄s */
strcat(g_temp,"正在创建套接字\n\n");
draw_text();
if (s >= 0)
{
sock_addr_action();
soc_connect_action(s);
}
else if(MS_SOC_USEOUT==s)
{
return 2;
}
else
{
return MS_SOC_ERROR; /* 内部错误 */
}
return 0;
}
int soc_create_udp_action()//这个用来实现UDP
{
int s;
//s = ms_soc_create(0, (void*)soc_cb_action); /* 由ms_soc_create_action函数创建函数套接字,成功返回句柄s */
s=ms_soc_create_udp(2, (void*)soc_cb_action);
strcat(g_temp,"正在创建套接字\n\n");
draw_text();
if (s >= 0)
{
sock_addr_action();
soc_send_action(s);//接收传递过来的相关参数
//soc_connect_action(s);
}
else if(MS_SOC_USEOUT==s)
{
;
}
else
{
return MS_SOC_ERROR; /* 内部错误 */
}
return 0;
}
void soc_connect_action(int s)
{
int ret;
strcat(g_temp,"正在连接\n\n");
draw_text();
ret = ms_soc_connect(s, &addr);
if (ret == MS_SOC_OK)
{
//执行socket 写操作
soc_send_action(s);
}
else if (ret == MS_SOC_WAIT)
{
return ;
}
else
{
//错误处理
}
}
int soc_send_action(int s)
{
int sent;
char buf[128];
sprintf(buf, "hello socket\n");
strcat(g_temp,"正在发送数据\n\n");
draw_text();
// ms_soc_create_udp(0,soc_send_action);
//sent = ms_soc_send(s, buf, strlen(buf));
sent=ms_soc_sendto(s,buf, strlen(buf),&addr);
if (sent > 0)
{
if (sent == (int)strlen(buf))
{
//所有信息已发送
strcat(g_temp,"完成所有数据发送\n\n");
draw_text();
}
else
{
//部分信息发送, 尝试在下次 MS_SOCEVT_WRITE 中发送其余的
strcat(g_temp,"完成部分数据发送\n\n");
draw_text();
}
}
else if (sent == MS_SOC_WAIT)
{
//信息发送阻塞,等待下次 MS_SOCEVT_WRITE
strcat(g_temp,"信息发送阻塞\n\n");
//sent=ms_soc_sendto(s,buf, strlen(buf),&addr);
draw_text();
;
}
else if (sent == MS_SOC_ERROR)
{
//信息发送错误, 尝试再次连接
strcat(g_temp,"数据发送时出错\n\n");
draw_text();
}
return sent;
}
int soc_recv_action(int s)
{
int recv=0;
char buf[128] = {0};
strcat(g_temp,"正在接收数据\n\n");
draw_text();
/* 从套接字中读取数据 */
//while ((recv = ms_soc_recv(s, buf, sizeof(buf))) > 0)
while (ms_soc_recvfrom(s,buf,sizeof(buf),&addr) > 0)
{
buf[recv] = 0;
strcat(g_temp,"收到数据:\n\n");
strcat(g_temp,buf);
strcat(g_temp,"\n\n");
draw_text();
}
if (recv == MS_SOC_EOF)
{
//所有信息已接受
strcat(g_temp,"完成所有数据接收\n\n");
draw_text();
ms_soc_close(s);
}
else if (recv == MS_SOC_WAIT)
{
//信息接收阻塞,等待下次 MS_SOCEVT_WRI
strcat(g_temp,"数据接收时网络阻塞\n\n");
draw_text();
}
else if (recv == MS_SOC_ERROR)
{
//信息发送错误, 尝试再次连接
strcat(g_temp,"数据接收时出错\n\n");
draw_text();
}
return recv;
}
static void draw_text()
{
int16 s[50];
int point_x,point_y,swidth,sheight;
int i = 0;
char * p = g_temp;
/* 填充屏幕 */
ms_gui_fill_rect(g_buf,0,0,scnifno.width,scnifno.height,MS_COLOR_BLACK,MS_COLOR_WHITE);
do {
char * p1 = p;
char str[50] = {0};
while (*p1!=0 && *p1++ != '\n');
if (p1 == p) break;
if (p1-p == 1)
{
p = p1;
continue;
}
strncpy(str, p, p1-p);
ms_gb2312_to_ucs2(s, sizeof(s), str);
/* 获取字符串宽高信息 */
ms_gui_get_string_info(s,&swidth,&sheight);
point_x = (scnifno.width - swidth) / 2;
point_y = (scnifno.height - sheight) / 2;
/* 绘制文字 */
ms_gui_textout(g_buf,5,5+15*i,s,ms_wstrlen(s),MS_COLOR_RED);
i ++;
p = p1+1;
if (5+15*i+5 > scnifno.height)
g_temp[0] = 0;
}
while (p && *p);
/* 绘制文字 */
ms_gui_textout(g_buf, 200, 300, ms_ucs2_string("退出"), ms_wstrlen(ms_ucs2_string("退出")), MS_COLOR_RED);
/* 刷屏 */
ms_gui_flush_layer(layer_hdl,1,0,0,scnifno.width-1,scnifno.height-1);
}
void timer_callback(int tid, int p)
{
draw_text();
}