| #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <unistd.h> | 
 | #include <errno.h> | 
 | #include <sys/socket.h> | 
 | #include <sys/un.h> | 
 | #include <netinet/in.h> | 
 | #include <pthread.h> | 
 | #include <sys/epoll.h> | 
 | #include <string.h> | 
 | #include <fcntl.h> | 
 | #include <signal.h> | 
 |  | 
 | #include "mbtk_tcpip.h" | 
 | #include "mbtk_log.h" | 
 |  | 
 | /* | 
 |     int link_id; | 
 |     char ser_addr[256]; | 
 |     int ser_port; | 
 |     mbtk_sock_type prot_type; // TCP/UDP | 
 |     mbtk_tcpip_type_enum tcpip_type; // Only support client. | 
 |     int local_port; | 
 |     bool ack_support; | 
 |     bool ssl_support; | 
 |     bool ignore_cert; | 
 |     uint32 heartbeat_time; | 
 |     uint32 delay_time; | 
 |  | 
 |     mbtk_tcpip_read_callback_func read_cb; | 
 |  | 
 | */ | 
 | static void help() | 
 | { | 
 |     printf("\n************************************************************************\n"); | 
 |     printf("net_open: Open network.\n"); | 
 |     printf("net_close: Close network.\n"); | 
 |     printf("link_open <link_id> <ser_addr> <ser_port> <loc_port> <TCP/UDP> <CLI/SER> <ack> <ssl> <ignore_cert> <heartbeat_time> <delay_time> <read_cb>: Open link.\n"); | 
 |     printf("link_close <link_id>: Close link.\n"); | 
 |     printf("send <link_id> <data>:Send data.\n"); | 
 |     printf("recv <link_id> <len>:Recv data.\n"); | 
 |     printf("traffic_reset <link_id>:Traffic reset.\n"); | 
 |     printf("traffic_get <link_id>:Traffic get.\n"); | 
 |     printf("state_get <link_id>:Link state get.\n"); | 
 |     printf("tcp_info <link_id>:TCP information state get.\n"); | 
 |     printf("\n************************************************************************\n"); | 
 | } | 
 |  | 
 | static void sig_process(int sig) | 
 | { | 
 |     LOGI("I got signal %d\n", sig); | 
 |     switch(sig) | 
 |     { | 
 |         case SIGINT: // Ctrl + C | 
 |         { | 
 |             LOGI("Exit by SIGINT.\n"); | 
 |             mbtk_tcpip_err_enum err = mbtk_tcpip_net_close(); | 
 |             if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                 printf("Net close success.\n"); | 
 |             } else { | 
 |                 printf("Net close fail:%d\n", err); | 
 |             } | 
 |             exit(0); | 
 |         } | 
 |         case SIGQUIT: // Ctrl + \ (类似 SIGINT ,但要产生core文件) | 
 |         { | 
 |             LOGI("Exit by SIGQUIT.\n"); | 
 |             mbtk_tcpip_err_enum err = mbtk_tcpip_net_close(); | 
 |             if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                 printf("Net close success.\n"); | 
 |             } else { | 
 |                 printf("Net close fail:%d\n", err); | 
 |             } | 
 |             exit(0); | 
 |         } | 
 |         case SIGTERM:// 默认kill   (同 SIGKILL ,但 SIGKILL 不可捕获) | 
 |         { | 
 |             LOGI("Exit by SIGTERM.\n"); | 
 |             mbtk_tcpip_err_enum err = mbtk_tcpip_net_close(); | 
 |             if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                 printf("Net close success.\n"); | 
 |             } else { | 
 |                 printf("Net close fail:%d\n", err); | 
 |             } | 
 |             exit(0); | 
 |         } | 
 |         case SIGTSTP:// Ctrl + Z (同 SIGSTOP ,但 SIGSTOP 不可捕获) | 
 |         { | 
 |             LOGI("Exit by SIGTSTP.\n"); | 
 |             exit(0); | 
 |         } | 
 |         case SIGSEGV: // 如空指针 | 
 |         { | 
 |             LOGI("Exit by SIGSEGV.\n"); | 
 |             exit(0); | 
 |         } | 
 |         default: | 
 |         { | 
 |             LOGI("Unknown sig:%d\n",sig); | 
 |             break; | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | void tcpip_print_tcp_info(mbtk_tcpip_tcp_state_info_s *info) | 
 | { | 
 |     printf("Link - %d\n", info->link_id); | 
 |     printf("fd - %d\n", info->sock_fd); | 
 |     printf("State - %d\n", info->state); | 
 |     printf("Recv data length - %d\n", info->recv_data_len); | 
 | } | 
 |  | 
 | void tcpip_read_cb(int link_id, const char* data, int data_len) | 
 | { | 
 |     printf("\nRECV(%d-%d):%s\n", link_id, data_len, data); | 
 | } | 
 |  | 
 | void tcpip_net_callback_func(int state, const char* addr) | 
 | { | 
 |     if(state) { | 
 |         printf("Net conncect, IP : %s\n", addr); | 
 |     } else { | 
 |         printf("Net disconnect.\n"); | 
 |     } | 
 | } | 
 |  | 
 | void tcpip_sock_callback_func(int link_id, int state) | 
 | { | 
 |     if(state == 0) { | 
 |         printf("Link[%d] disconnected.\n", link_id); | 
 |     } | 
 | } | 
 |  | 
 | int main(int argc, char *argv[]) | 
 | { | 
 |     signal(SIGINT, sig_process); | 
 |     signal(SIGQUIT, sig_process); | 
 |     signal(SIGTERM, sig_process); | 
 |     //signal(SIGTSTP, sig_process); | 
 |     //signal(SIGSEGV, sig_process); | 
 |  | 
 |     mbtk_log_init("radio","MBTK_TCPIP"); | 
 |  | 
 |     printf(">>>>>>>>>>>>>>>>>>>>>>>>Enter cmd:\n"); | 
 |     char cmd[100]; | 
 |     while(1) | 
 |     { | 
 |         memset(cmd, 0, 100); | 
 |         mbtk_tcpip_err_enum err; | 
 |         if(fgets(cmd, 100, stdin)) | 
 |         { | 
 |             char *ptr = cmd + strlen(cmd) - 1; | 
 |             while(ptr >= cmd && (*ptr == '\r' || *ptr == '\n')) | 
 |             { | 
 |                 *ptr-- = '\0'; | 
 |             } | 
 |             // net_open | 
 |             if(!strncasecmp(cmd, "net_open", 8)){ | 
 |                 err = mbtk_tcpip_net_open(tcpip_net_callback_func, tcpip_sock_callback_func); | 
 |                 if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                     printf("Net open success.\n"); | 
 |                 } else { | 
 |                     printf("Net open fail:%d\n", err); | 
 |                 } | 
 |             } else if(!strncasecmp(cmd, "net_close", 9)){ // net_close | 
 |                 err = mbtk_tcpip_net_close(); | 
 |                 if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                     printf("Net close success.\n"); | 
 |                 } else { | 
 |                     printf("Net close fail:%d\n", err); | 
 |                 } | 
 |             } | 
 |             // link_open <link_id> <ser_addr> <ser_port> <loc_port> <TCP/UDP> <CLI/SER> <ack> <ssl> <ignore_cert> <heartbeat_time> <delay_time> <read_cb> | 
 |             else if(!strncasecmp(cmd, "link_open", 9)){ | 
 |                 mbtk_tcpip_info_t info; | 
 |                 char prot_type[10] = {0}; | 
 |                 char type[10] = {0}; | 
 |                 int read_cb_set; | 
 |                 memset(&info, 0x0, sizeof(mbtk_tcpip_info_t)); | 
 |                 int ack_support,ssl_support,ignore_cert; | 
 |                 int count = sscanf(cmd, "link_open %d %s %d %d %s %s %d %d %d %d %d %d", &(info.link_id), | 
 |                                 info.ser_addr, &(info.ser_port), &(info.local_port), prot_type, type, | 
 |                                 &ack_support, &ssl_support, &ignore_cert, &(info.heartbeat_time), | 
 |                                 &(info.delay_time), &read_cb_set); | 
 |                 if(count == 12) { | 
 |                     info.ack_support = (bool)ack_support; | 
 |                     info.ssl_support = (bool)ssl_support; | 
 |                     info.ignore_cert = (bool)ignore_cert; | 
 |                     if(!strncasecmp(prot_type, "UDP", 3)) { | 
 |                         info.prot_type = MBTK_SOCK_UDP; | 
 |                     } else { | 
 |                         info.prot_type = MBTK_SOCK_TCP; | 
 |                     } | 
 |  | 
 |                     if(!strncasecmp(type, "SER", 3)) { | 
 |                         info.tcpip_type = MBTK_TCPIP_TYPE_SERVER; | 
 |                     } else { | 
 |                         info.tcpip_type = MBTK_TCPIP_TYPE_CLIENT; | 
 |                     } | 
 |  | 
 |                     if(read_cb_set) { | 
 |                         info.read_cb = tcpip_read_cb; | 
 |                     } else { | 
 |                         info.read_cb = NULL; | 
 |                     } | 
 |  | 
 |                     err = mbtk_tcpip_sock_open((const mbtk_tcpip_info_t*)(&info)); | 
 |                     if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                         printf("Link open success.\n"); | 
 |                     } else { | 
 |                         printf("Link open fail:%d\n", err); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } else if(!strncasecmp(cmd, "link_close", 10)){ // link_close <link_id> | 
 |                 int link_id; | 
 |                 int count = sscanf(cmd, "link_close %d", &link_id); | 
 |                 if(count == 1) { | 
 |                     err = mbtk_tcpip_sock_close(link_id); | 
 |                     if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                         printf("Link close success.\n"); | 
 |                     } else { | 
 |                         printf("Link close fail:%d\n", err); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } else if(!strncasecmp(cmd, "send", 4)){ // send <link_id> <data> | 
 |                 int link_id; | 
 |                 char data[100] = {0}; | 
 |                 int count = sscanf(cmd, "send %d %s", &link_id, data); | 
 |                 if(count == 2) { | 
 |                     int len = mbtk_tcpip_send(link_id, data, strlen(data), NULL, 0); | 
 |                     if(len == strlen(data)) { | 
 |                         printf("Send success:%d.\n", len); | 
 |                     } else { | 
 |                         printf("Send fail:%d/%d\n", len, strlen(data)); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } else if(!strncasecmp(cmd, "recv", 4)){ // recv <link_id> <len> | 
 |                 int link_id; | 
 |                 int read_size; | 
 |                 int count = sscanf(cmd, "recv %d %d", &link_id, &read_size); | 
 |                 if(count == 2 && read_size > 0 && read_size <= 2048) { | 
 |                     char buff[2048] = {0}; | 
 |                     int len = mbtk_tcpip_read(link_id, buff, read_size); | 
 |                     if(len > 0) { | 
 |                         printf("RECV[%d]:%s\n", len, buff); | 
 |                     } else { | 
 |                         printf("RECV fail:%d\n", len); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } else if(!strncasecmp(cmd, "traffic_reset", 13)){ // traffic_reset <link_id> | 
 |                 int link_id; | 
 |                 int count = sscanf(cmd, "traffic_reset %d", &link_id); | 
 |                 if(count == 1) { | 
 |                     err = mbtk_tcpip_data_traffic_reset(link_id); | 
 |                     if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                         printf("Traffic reset success.\n"); | 
 |                     } else { | 
 |                         printf("Traffic reset fail:%d\n", err); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } else if(!strncasecmp(cmd, "traffic_get", 11)){ // traffic_get <link_id> | 
 |                 int link_id; | 
 |                 int count = sscanf(cmd, "traffic_get %d", &link_id); | 
 |                 if(count == 1) { | 
 |                     int traffic = mbtk_tcpip_data_traffic_get(link_id); | 
 |                     if(traffic >= 0) { | 
 |                         printf("Traffic : %d\n", traffic); | 
 |                     } else { | 
 |                         printf("Get raffic fail:%d\n", traffic); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } else if(!strncasecmp(cmd, "state_get", 9)){ // state_get <link_id> | 
 |                 int link_id; | 
 |                 int count = sscanf(cmd, "state_get %d", &link_id); | 
 |                 if(count == 1) { | 
 |                     int state = mbtk_tcpip_link_state_get(link_id); | 
 |                     if(state == 1) { | 
 |                         printf("Link %d connected.\n", link_id); | 
 |                     } else if(state == 0) { | 
 |                         printf("Link %d disconnected.\n", link_id); | 
 |                     } else { | 
 |                         printf("Get link state fail:%d\n", state); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } | 
 |             else if(!strncasecmp(cmd, "tcp_info", 8)){ // tcp_info <link_id> | 
 |                 int link_id; | 
 |                 int count = sscanf(cmd, "tcp_info %d", &link_id); | 
 |                 if(count == 1) { | 
 |                     mbtk_tcpip_tcp_state_info_s tcp_info; | 
 |                     if(mbtk_tcpip_info_get(link_id, &tcp_info)) { | 
 |                         printf("mbtk_tcpip_info_get() fail.\n"); | 
 |                     } else { | 
 |                         tcpip_print_tcp_info(&tcp_info); | 
 |                     } | 
 |                 } else { | 
 |                     printf("ARG error.\n"); | 
 |                 } | 
 |             } | 
 |             else if(!strcasecmp(cmd, "h") || !strcasecmp(cmd, "help")) { | 
 |                 help(); | 
 |             } else if(!strcasecmp(cmd, "q")) { | 
 |                 err = mbtk_tcpip_net_close(); | 
 |                 if(err == MBTK_TCPIP_ERR_SUCCESS) { | 
 |                     printf("Net close success.\n"); | 
 |                 } else { | 
 |                     printf("Net close fail:%d\n", err); | 
 |                 } | 
 |                 break; | 
 |             } else { | 
 |                 printf("\n"); | 
 |             } | 
 |         } | 
 |     } | 
 |  | 
 |     LOGD("Client exec complete."); | 
 | #if 1 | 
 |     while(1) | 
 |     { | 
 |         sleep(365 * 24 * 60 * 60); | 
 |     } | 
 | #else | 
 |     sleep(1); | 
 | #endif | 
 |     return 0; | 
 | } | 
 |  |