int system_send_buf_to_host( char* buf, int buf_size ) { char* sendbuf; int stat = 0; if( g_send_package_socket != 0) { stat = tcp_get_state( g_send_package_socket ); switch ( stat ) { case TCP_STATE_FREE: case TCP_STATE_CLOSED: tcp_connect ( g_send_package_socket, g_send_package_socket_ip, g_send_package_socket_port, 0); #if 1 return -2; #else // wait connect // maybe need while( 1 ){ stat = tcp_get_state( g_send_package_socket ); timer_poll (); main_TcpNet (); if( stat == TCP_STATE_CONNECT ) break; } #endif break; } if( stat == TCP_STATE_CONNECT ) { while(tcp_check_send ( g_send_package_socket) != __TRUE) { timer_poll (); main_TcpNet (); } if (tcp_check_send ( g_send_package_socket) == __TRUE) { sendbuf = tcp_get_buf( buf_size ); memcpy( sendbuf, buf, buf_size ); tcp_send ( g_send_package_socket, sendbuf, buf_size); #if 1 return 1; #else while( 1 ){ stat = tcp_get_state( g_send_package_socket ); timer_poll (); main_TcpNet (); if( stat == TCP_STATE_CONNECT ) break; } #endif } } else{ return -3; } } else return -4; return -5; }
/***************************************************************************** ** Function name: U16 tcpSend (void) ** ** Descriptions: Envia dados TCP *****************************************************************************/ U16 tcpSend (char *p, U8 sz,U8 soc,U8 send) { U8 *sendbuf,ip[4]; switch (tcp_get_state (soc)) { case TCP_STATE_FREE: case TCP_STATE_CLOSED: if(send == CMD_SEND_TO_SERVER) { inet_aton((U8*)cfg.tcp.ip_serv_rem,ip); tcp_connect(soc,ip,atoi(cfg.tcp.port_serv_rem),atoi(cfg.tcp.port_serv_loc)); } break; case TCP_STATE_CONNECT: /* We are connected, send command to remote peer. */ if(tcp_check_send (soc)) { sendbuf = tcp_get_buf (sz); strncpy((char *)sendbuf,(const char *)p,sz); if(tcp_send (soc, sendbuf, sz)) return __TRUE; /*Packet Sent*/ else return __FALSE; /*Send Error*/ } break; } return __TRUE; }
static int chr_tcp_accept (char_tcp_t *drv) { if (drv->fd >= 0) { return (0); } if (drv->listen_fd < 0) { return (1); } if ((tcp_get_state (drv->listen_fd, 0) & 1) == 0) { return (1); } drv->fd = tcp_accept (drv->listen_fd); if (drv->fd < 0) { return (1); } chr_tcp_init_connection (drv); return (0); }
static unsigned chr_tcp_write (char_drv_t *cdrv, const void *buf, unsigned cnt) { char_tcp_t *drv; ssize_t r; unsigned st; drv = cdrv->ext; if (chr_tcp_accept (drv)) { return (cnt); } st = tcp_get_state (drv->fd, 0); if (st & 4) { chr_tcp_shutdown (drv); return (cnt); } if ((st & 2) == 0) { return (0); } #if UINT_MAX > SSIZE_MAX if (cnt > SSIZE_MAX) { cnt = SSIZE_MAX; } #endif if (drv->telnet) { r = telnet_write (drv, buf, cnt); } else { r = write (drv->fd, buf, cnt); } if (r <= 0) { chr_tcp_shutdown (drv); return (cnt); } return (r); }
static unsigned chr_tcp_read (char_drv_t *cdrv, void *buf, unsigned cnt) { char_tcp_t *drv; ssize_t r; unsigned st; drv = cdrv->ext; if (chr_tcp_accept (drv)) { return (0); } st = tcp_get_state (drv->fd, 0); if (st & 4) { chr_tcp_shutdown (drv); return (0); } if ((st & 1) == 0) { return (0); } #if UINT_MAX > SSIZE_MAX if (cnt > SSIZE_MAX) { cnt = SSIZE_MAX; } #endif r = read (drv->fd, buf, cnt); if (r <= 0) { chr_tcp_shutdown (drv); return (0); } if (drv->telnet) { r = telnet_filter_input (drv, buf, r); } return (r); }
/***************************************************************************** ** Function name: U16 tcp_task (void) ** ** Descriptions: envia dados para o servidor TCP *****************************************************************************/ void tcp_task(void) { static U32 tcp_timer = 0u; U8 buf_udp[100],i; /****************** instantâneo ********************************/ #if USE_TCP_SERVER /*Comunicação TCP SERVER será usada?*/ U8 ip[4]; #if USE_PCK_SERV static U32 cnt_tcp_serv = 0u; if(tcp_state.bit.dataToSend) { tcp_state.bit.dataToSend = __FALSE; cnt_tcp_serv = 0; //if(tcp_buf[0] == 0) //sprintf((char*)tcp_buf,"%02X.%02X.%02X.%02X.%02X.%02X\r\n\0",own_hw_adr[0],own_hw_adr[1],own_hw_adr[2],own_hw_adr[3],own_hw_adr[4],own_hw_adr[5]); //tcpSend((char*)tcp_buf, strlen((const char*)tcp_buf), tcp_server_soc, CMD_SEND_TO_SERVER); //memset(tcp_buf,0,sizeof(tcp_buf)); } #endif #endif /****************** a cada 100ms *******************************/ if(!tick) return; ++tcp_timer; dhcp_check(); /****************** a cada 1s **********************************/ if((tcp_timer%TASK_1S)) return; #if USE_TCP_CLIENT if(!(tcp_timer%TASK_5S)) { /*Pacote UDP de identificação*/ sprintf((char*)buf_udp,"%s %u.%u.%u.%u %02X.%02X.%02X.%02X.%02X.%02X %s %s %u.%u.%u.%u %u.%u.%u.%u\r\n\0",lhost_name,MY_IP[0],MY_IP[1],MY_IP[2],MY_IP[3], own_hw_adr[0],own_hw_adr[1],own_hw_adr[2],own_hw_adr[3],own_hw_adr[4],own_hw_adr[5], cfg.tcp.port_serv_rem, cfg.tcp.ip_serv_rem, MY_MASK[0], MY_MASK[1], MY_MASK[2], MY_MASK[3], MY_GATEWAY[0], MY_GATEWAY[1], MY_GATEWAY[2], MY_GATEWAY[3]); if(!ftp_state.bit.UpdateTcp) udpSendBroadcast(buf_udp); //udpSendUnicast(buf_udp,cfg.tcp.ip_app); } if(!(tcp_timer%TASK_30S)) /*A cada 30s*/ { /*Mantém o link ativo*/ //if(tcp_get_state (tcp_client_soc[0]) == TCP_STATE_CONNECT) //{ sprintf(buf_tx,"LOK OK\r\n\0"); for(i=0;i<MAX_NUM_SOC;i++) tcpSend (buf_tx, strlen(buf_tx), tcp_client_soc[i], CMD_SEND_TO_CLIENT); //tcpSend (buf_tx, strlen(buf_tx), tcp_client_soc[0], CMD_SEND_TO_CLIENT); //} } #endif #if USE_TCP_SERVER && USE_PCK_SERV /*Comunicação TCP SERVER será usada?*/ if(!(++cnt_tcp_serv % atoi(cfg.tcp.interval_packet_serv))) tcp_state.bit.dataToSend = __TRUE; #endif #if USE_TCP_SERVER /*Comunicação TCP SERVER será usada?*/ /*Analisa estado de comunicação com o servidor externo*/ if(tcp_get_state (tcp_server_soc) != TCP_STATE_CONNECT) { tcp_state.bit.serverConnected = __FALSE; inet_aton((U8*)cfg.tcp.ip_serv_rem,ip); tcp_connect(tcp_server_soc,ip,atoi(cfg.tcp.port_serv_rem),atoi(cfg.tcp.port_serv_loc)); }else tcp_state.bit.serverConnected = __TRUE; #endif /*Houve alteração das cenas via FTP?*/ if(ftp_state.bit.UpdateScene) { printf ("[Scene config via FTP]\r\r"); fflush(stdout); ftp_state.bit.UpdateScene = __FALSE; init_scene(0xFF); } if(ftp_state.bit.UpdateFileCfg) { printf ("[CFG.CFG configurado via FTP]\r\r"); fflush(stdout); ftp_state.bit.UpdateFileCfg = __FALSE; read_file_cfg(); } /*Houve alteração das configurações TCP via FTP?*/ if(ftp_state.bit.UpdateTcp) { printf ("[TCP Config via FTP..Reiniciando]\r\r"); fflush(stdout); #if USE_TCP_CLIENT for(i=0;i<MAX_NUM_SOC;i++) tcp_close (tcp_client_soc[i]); #endif #if USE_TCP_SERVER tcp_close (tcp_server_soc); #endif LPC_WDT->WDTC = 0x003FFFF; /*0.5s*/ wdt_feed(); while(1); } }