//+------------------------------------------------------------------+ //| Main data reading function | //+------------------------------------------------------------------+ int CSourceInterface::Read(FeedData *inf) { DWORD ctm; //---- check if(inf==NULL || m_buffer==NULL) return(FALSE); inf->ticks_count=0; //---- есть синтетические инструменты? if(m_syntetics.GetTicks(inf)!=FALSE) return(TRUE); //---- is connection opened? if(m_socket==INVALID_SOCKET) { //---- try connect if(Connect(m_server,m_login,m_password)==FALSE) { _snprintf(inf->result_string,sizeof(inf->result_string)-1,"no connection %s",m_server); inf->result=FALSE; return(FALSE); } //if(Login(inf)==FALSE) return(FALSE); } //---- is login succesful? //if(m_loginflag==FALSE) //if(Login(inf)==FALSE) return(FALSE); //---- read data while(m_socket!=INVALID_SOCKET) { //---- send ping every minute ctm=GetTickCount(); if(ctm<m_lasttime) m_lasttime=ctm-1000; // проверка перехода через 49 дней if((ctm-m_lasttime)>60000) { //---- заодно загрузим базу синтетических инструментов m_syntetics.Load(); //---- m_lasttime=ctm; if(SendString("> Ping\r\n")==FALSE) { strcpy(inf->result_string,"ping failed"); ExtLogger.Out("Read: %s",inf->result_string); return(FALSE); } } //---- check data if(DataRead()==FALSE) { COPY_STR(inf->result_string,"connection lost"); ExtLogger.Out("Read: %s",inf->result_string); return(FALSE); } //---- parse while we can read strings while(DataParseLine(m_buffer,BUFFER_SIZE-1)) { //---- it is news? if(memcmp(m_buffer,"< News",6)==0) return ReadNews(inf); //---- skip service information if(m_buffer[0]=='<' || m_buffer[0]=='>') continue; //---- parse ticks if(ReadTicks(m_buffer,inf)==FALSE) return(FALSE); //---- check free space for new account if(inf->ticks_count<COUNTOF(inf->ticks)) continue; //---- break parsing break; } //---- check ticks if(inf->ticks_count>0) { //---- update syntetics m_syntetics.AddQuotes(inf); //---- return data to server return(TRUE); } //---- Sleep(10); } //---- some error return(TRUE); }
int main(int argc, char **argv) // ignore_convention { NETADDR BindAddr; dbg_logger_stdout(); net_init(); mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = VERSIONSRV_PORT; if(!g_NetOp.Open(BindAddr, 0)) { dbg_msg("mastersrv", "couldn't start network"); return -1; } BuildPackets(); ReadNews(); ReadServerList(); dbg_msg("versionsrv", "started"); while(1) { g_NetOp.Update(); // process packets CNetChunk Packet; while(g_NetOp.Recv(&Packet)) { if(Packet.m_DataSize == sizeof(VERSIONSRV_GETVERSION) && mem_comp(Packet.m_pData, VERSIONSRV_GETVERSION, sizeof(VERSIONSRV_GETVERSION)) == 0) { SendVer(&Packet.m_Address); char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&Packet.m_Address, aAddrStr, sizeof(aAddrStr), false); dbg_msg("versionsrv", "version request by %s", aAddrStr); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETNEWS) && mem_comp(Packet.m_pData, VERSIONSRV_GETNEWS, sizeof(VERSIONSRV_GETNEWS)) == 0) { SendNews(&Packet.m_Address); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) && mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0) { CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; for(int i = 0; i < m_NumPackets; i++) { p.m_DataSize = m_aPackets[i].m_Size; p.m_pData = &m_aPackets[i].m_Data; g_NetOp.Send(&p); } } if(m_ServerListLoaded && Packet.m_DataSize == sizeof(VERSIONSRV_GETDDNETLIST) + 4 && mem_comp(Packet.m_pData, VERSIONSRV_GETDDNETLIST, sizeof(VERSIONSRV_GETDDNETLIST)) == 0) { char aToken[4]; mem_copy(aToken, (char*)Packet.m_pData+sizeof(VERSIONSRV_GETDDNETLIST), 4); SendServerList(&Packet.m_Address, aToken); } } // wait for input net_socket_read_wait(g_NetOp.m_Socket, 1000000); } return 0; }