/*
* stb_client_test.c
*
* Created on: 2015年3月16日
* Author: Administrator
*/
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <poll.h>
#include <pthread.h>
#include "simulation_stb_connect_to_g_net.h"
// socket info
#define G_NET_UPDATE_SERVER_ADDR "127.0.0.1"
#define PORT 8111
#define SIMULATION_CMD 0xA0
#define SIMULATION_PID 5
#define SIMULATION_CID 174
#define SIMULATION_MID 2
// email info
#define EMAIL_TITLE "174.128.235.194 G-Net connect state"
#define EMAIL_CONTEXT_CONNECT_ERROR "connect error"
#define EMAIL_CONTEXT_RECV_ERROR "g_net error(recv data error)"
#define MAX_SN_LEN 8
#define TRY_CONNECT_TIMES 1
#define PORT_NUMBER 1
static int port[PORT_NUMBER] = {8111};
static pthread_t accep_thread_t;
static int connect_total = 0;
typedef int BOOL;
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (!FALSE)
#endif
typedef struct
{
unsigned int cmd :8;
unsigned int customer_id :8;
unsigned int model_id :8;
unsigned int platform_id :8;
unsigned char sn[MAX_SN_LEN-2];
unsigned char ui;
unsigned char reserved0;
unsigned int check :8;
unsigned int reserved1 :24;
} STB_TO_SERVER_REQUEST;
typedef struct
{
unsigned int cmd :8;
unsigned int length :16;
unsigned int reserved :8;
union {
unsigned char *seg_list_src_data;
char *version;
};
} SERVER_TO_STB_BACK;
typedef struct
{
char max_version[15 + 1];
char max_forced_version[15 + 1];
int upgrade_count; // max_version upgrade count
} SERVER_TO_STB_AUTO_UPDATE_INFO;
/**
* return value:0: recv data error, 1: connect error, 2: success
*/
int simulation_stb_connect_to_g_net(int port)
{
int return_value = 0;
int socket_fd, err, num, loc;
struct sockaddr_in server_addr;
char locator[64] = G_NET_UPDATE_SERVER_ADDR;
int send_data_len;
STB_TO_SERVER_REQUEST stb_to_server_data;
int recv_len;
char recv_buffer[2048] = {0};
send_data_len = sizeof(STB_TO_SERVER_REQUEST);
memset(&stb_to_server_data, 0, send_data_len);
stb_to_server_data.cmd = 0xD0;//SIMULATION_CMD;
stb_to_server_data.customer_id = SIMULATION_CID; //test
stb_to_server_data.model_id = SIMULATION_MID;
stb_to_server_data.platform_id = SIMULATION_PID;
memcpy(stb_to_server_data.sn, "aaaaa", 5);
// create socket
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
// set server data info
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr(G_NET_UPDATE_SERVER_ADDR);
printf("start connect\n");
// connect
err = connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(err == 0)
{
// send
while ((num = write(socket_fd, (char *)&stb_to_server_data, send_data_len)) > 0)
{
loc += num;
send_data_len -= num;
}
// recv
num = recv(socket_fd, recv_buffer, 2048, 0);
if (num > 0) // success
{
printf("rcv length = %d\n", num);
SERVER_TO_STB_BACK *p = (SERVER_TO_STB_BACK *)recv_buffer;
printf("cmd = %d\n", p->cmd);
printf("length = %d\n", ntohs(p->length));
//char * segment = recv_buffer + sizeof(SERVER_TO_STB_BACK);
//printf("seg_list_src_data = %s\n", segment);
SERVER_TO_STB_AUTO_UPDATE_INFO *autoUpgrade = (SERVER_TO_STB_AUTO_UPDATE_INFO *)(recv_buffer + sizeof(SERVER_TO_STB_BACK));
printf("max_version = %s\n", autoUpgrade->max_version);
printf("max_forced_version = %s\n", autoUpgrade->max_forced_version);
printf("upgrade_count = %d\n", ntohl(autoUpgrade->upgrade_count));
//return_value = 2;
}
printf("out");
}
else
{
return_value = 1;
}
return return_value;
}
static void *accept_thread(void *arg)
{
int port_index , index;
for (port_index = 0; port_index < PORT_NUMBER; port_index++)
{
// simulation connect 3 times
for(index = 0; index < TRY_CONNECT_TIMES; index++)
{
simulation_stb_connect_to_g_net(port[port_index]);
}
}
return NULL;
}
static int create_accept_task(void)
{
return pthread_create(&accep_thread_t, NULL, accept_thread, NULL);
}
int main()
{
int index = 0, temp;
int port_index = 0;
//create_accept_task();
for (port_index = 0; port_index < PORT_NUMBER; port_index++)
{
// simulation connect 3 times
for(index = 0; index < TRY_CONNECT_TIMES; index++)
{
temp = simulation_stb_connect_to_g_net(port[port_index]);
}
}
return 0;
}