blob: 8a7d279909fc79d914b23f718d3b6785ab6de6ca [file] [log] [blame]
#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;
}