Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47711
  • 博文数量: 26
  • 博客积分: 586
  • 博客等级: 中士
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-08 20:10
文章分类
文章存档

2012年(6)

2011年(20)

我的朋友

分类: 网络与安全

2011-04-14 20:47:02

#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();
}
阅读(1115) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zhr8110222011-04-14 20:49:45

* 模块内部变量声明。
* ----------------------------------------------------------------------- */
typedef struct _soc_session_t {
        int used;
        int handle;
        SOCKET socket;
        enum {TCP_CONNECTING, TCP_CONNECTED, TCP_WAIT_CLOSE} tcp_state;
        enum {UDP_CONNECTING, UDP_CONNECTED, UDP_WAIT_CLOSE} udp_state;
    &nb