//---------------------------------------------------------------------------
#include <vcl.h>
#include <winsock2.h>
#include <winuser.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <mbstring.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TFormo *Formo;
//---------------------------------------------------------------------------
__fastcall TFormo::TFormo(TComponent* Owner)
        : TForm(Owner)
{
FILE *out2;
IpAddr="";port_iz="";date_N="";mesag="";time_N="";Log_pro="";
TDateTime DateTime = TDateTime::CurrentDateTime(); //дата для лога программы
Edit4->Visible = false;
Label7->Visible = false;
Memo1->ScrollBars=ssBoth;  //установоли прокрутку в окне собщений
HW = new THintWindow(this);
Timer1->Enabled=false;
date_N=DateTime.DateString();
time_N=DateTime.TimeString();
dir_N = GetCurrentDir();
Log_pro=dir_N+"\\!Logs.txt";   // лог программы
out2 = fopen(Log_pro.c_str(),"a+");
if (out2 == NULL)
    MessageDlg("Файл не был открыт!!!",
               mtError, TMsgDlgButtons() << mbOK, 0);
else
   {
     fprintf(out2,"*********************************************************** \n");
     fprintf(out2,"%s\t",date_N);
     fprintf(out2,"%s\t",time_N);
     fprintf(out2,"Программа начала работу \n");
   }
fclose(out2);
Timer2->Enabled = false;
Timer2->Interval = 60000;
Timer2->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TFormo::WMUserN (TMessage & msg)
{
//обработчик приходящего сообщения
  TDateTime DateTime = TDateTime::CurrentDateTime();
  char buf[1500];
  int *j= new int;
  AnsiString t="";
  *j=sizeof(buf);
//--------------------*время показа хинта*-----------------------------------
  Timer1->Enabled=false;
   if (CheckBox2->Checked)
  {
    t = Edit4->Text;
    if (t =="")
     {
       t = "10000";
       MessageDlg("Время показа по умолчанию: 30 секунд!" ,
               mtInformation, TMsgDlgButtons() << mbOK, 0);
       time=TryStrToInt(t,time);
       Edit4->Text="10";
       Timer1->Interval = time;
     }
    if (t!="")
       if (!(TryStrToInt(t,time)) || t<1 )
            {
             MessageDlg("Время показа по умолчанию: 10",
                       mtWarning, TMsgDlgButtons() << mbOK, 0);
             Edit4->Text="10";
             time = 10;
             Timer1->Interval = time*1000;
            }
  }
  else
     {
       time = 10000;
       Timer1->Interval = time;
     }
//----------------------------------------------------------------------------
  NOTIFYICONDATA nid;
  int *nLen = new int;
  int *z = new int;
  int *kol = new int;
  kod = 0;
  AnsiString u="",mes="",o="",f="",pp="",temp="",temp1="",a="";
  date_N="";
  time_N="";
  struct sockaddr_in from;
  HOSTENT *hst;
  int nLength=sizeof(struct sockaddr_in);
  switch (WSAGETSELECTEVENT(msg.LParam))
        {
          case FD_READ:
               {
                 *nLen=recvfrom(serv,buf,*j,0,(struct sockaddr*)&from,&nLength);
                 if(*nLen>0)
                    {
                      date_N=DateTime.DateString();
                      time_N=DateTime.TimeString();
                      IpAddr = inet_ntoa (from.sin_addr );  // получаем IP адрес
                      hst = gethostbyaddr((char*)&from.sin_addr,4,AF_INET); //получение имини хоста
                      u = hst->h_name;  //имя хоста
                      port_iz = htons(from.sin_port); //получение порта отправителя
                      Memo1->Lines->Add("DateTime прилета: " + date_N +" "+ time_N);
                      Memo1->Lines->Add("Адрес отправителя: "+u +"["+ IpAddr +"]" + ":"+ port_iz);
                      buf[*nLen]='\0';
//-----------------------------Определение уровня критичности-------------------------------------------
                      for (int i =0; i<*nLen; i++)
                          {
                            *z=6;
                            if (buf[0]!='<')
                                pp+=buf[i];
                            if ( i==0 && buf[0]=='<')
                               {
                                 i++;
                                 temp=buf[0];
                                 while (buf[i]!='>' && buf[i]!='\0')
                                      {
                                        o+=buf[i];
                                        i++;
                                      }
                                 if (!(TryStrToInt(o,*z)))
                                    {
                                      *z=6;
                                      while (buf[i]!='\0')
                                           {
                                             o+=buf[i];
                                             i++;
                                           }
                                      pp=temp+o;
                                    }
                                 else
                                    {
                                      i++;
                                      while (buf[i]!='\0')
                                           {
                                             pp+=buf[i];
                                             i++;
                                           }
                                    }
                               }

                          }
//----------------------- код критичности -----------------------------------
                      kod = *z & 7;     // получаем код критичности
                      switch (kod)    // определение критичности сообщения
                      {
                        case 0:
                              {
                                f = "Emergency";
                                break;
                              }
                        case 1:
                              {
                                f = "Alert";
                                break;
                              }
                        case 2:
                              {
                                f = "Critical";
                                break;
                              }
                        case 3:
                              {
                                f = "Error";
                                break;
                              }
                        case 4:
                              {
                                f = "Warning";
                                break;
                              }
                        case 5:
                              {
                                f = "Notice";
                                break;
                              }
                        case 6:
                              {
                                f = "Informational";
                                break;
                              }
                        case 7:
                              {
                                f = "Debug";
                                break;
                              }
                        default: break;
                      }
//----------------------------------------------------------------------------
                      *kol = pp.Length();
                      a="Длинна сообщения:"+AnsiString(*kol)+"\r\n"+f+":"+pp;
                      Memo1->Lines->Add(a);
                      mesag=date_N+" "+time_N +" От кого: "+u+"["+IpAddr+"]"+":"+port_iz + a; //сообщение для хинта
                      mes = pp;
                      CreateHint();
                      LogsFiles(date_N, time_N, u, IpAddr, port_iz, f, mes);
                    }
               }
        }
delete buf;
delete kol;
delete nLen;
delete z;
delete j;
u="";mes="";o="";f="";pp="";temp="";temp1="";t="";
}
//---------------------------------------------------------------------------
void __fastcall TFormo::Button3Click(TObject *Sender)
{
AnsiString p="";
ini_F="";
dir_N = GetCurrentDir();
ini_F= dir_N + "\\cong.ini";
    p=Edit3->Text;
    if (p=="")
        ShowMessage("Введите порт");
    else
    {
      if (!(TryStrToInt(p,port)))
          ShowMessage("число надо вводить!!!");
      else
      {
        if (port<0 || port>65535)
            ShowMessage("Не верный порт!!!");
        else
         {
            Button1->Visible=true;
            Button2->Visible=true;
            Button6->Visible=true;
            CheckBox2->Visible=true;
            Memo1->Visible=true;
            Edit3->Enabled=false;
            Button3->Visible=false;
            ini = new TIniFile(ini_F);
            ini->WriteString("MAIN","PORT",p);
            ini->Free();
         }
      }
    }
p="";
}
//---------------------------------------------------------------------------
void __fastcall TFormo::Button1Click(TObject *Sender)
{
FILE *out2;
TDateTime DateTime = TDateTime::CurrentDateTime();
//открытие сокета задание порта
AnsiString po;
out2 = fopen(Log_pro.c_str(),"a+");
po=Edit3->Text;
if (po=="")
     {
      po="5555";
      MessageDlg("Открыт порт по умолчанию: " +po,
               mtInformation, TMsgDlgButtons() << mbOK, 0);
      port=TryStrToInt(po,port);
     }
if (po!="")
  {
    if(!(TryStrToInt(po,port)))
        ShowMessage("число надо вводить!!!");
    else
    {
    if (port<0 || port>65535)
        ShowMessage("Не верный порт!!!");
  else
  {
// Инициализация сокета
  WSADATA wsaData;
  error=WSAStartup(MAKEWORD( 2, 0 ), &wsaData);
  if (error==SOCKET_ERROR)
     {
       Memo1->Lines->Add("произошла ошибка");
       date_N=DateTime.DateString();
       time_N=DateTime.TimeString();
       fprintf(out2,"%s\t",date_N);
       fprintf(out2,"%s\t",time_N);
       fprintf(out2,"Произошла ошибка! Программа закрыта \n");
       fclose(out2);
       WSACleanup();
       Close();
     }
  else
      {
        Memo1->Lines->Add("Инициализация прошла");
        date_N=DateTime.DateString();
        time_N=DateTime.TimeString();
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Инициализация прошла успешно \n");
      }
// Обьявление сокета, присвоение адреса и порта
  sockaddr_in sock;
  sock.sin_family = AF_INET;
  sock.sin_port = htons(port);
  sock.sin_addr.s_addr = htonl(INADDR_ANY);
  serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (serv == SOCKET_ERROR)
    {
      Memo1->Lines->Add("Ошибка в сокете");
      date_N=DateTime.DateString();
      time_N=DateTime.TimeString();
      fprintf(out2,"%s\t",date_N);
      fprintf(out2,"%s\t",time_N);
      fprintf(out2,"Ошибка в сокете! Программа закрыта\n");
      fclose(out2);
      WSACleanup();
      Close();
    }
  else
     {
        Memo1->Lines->Add("Сокет ок");
        date_N=DateTime.DateString();
        time_N=DateTime.TimeString();
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Сокет успешен! \n");
     }
// создание сокета
  error = bind(serv, (sockaddr*)&sock,sizeof(sock));
  if (error == SOCKET_ERROR)
    {
       Memo1->Lines->Add("Ошибка в bind");
       date_N=DateTime.DateString();
       time_N=DateTime.TimeString();
       fprintf(out2,"%s\t",date_N);
       fprintf(out2,"%s\t",time_N);
       fprintf(out2,"Ошибка в bind! Программа закрыта \n");
       fclose(out2);
       WSACleanup();
       Close();
    }
  else
      {
        GetLastError();
        Memo1->Lines->Add("bind успешен");
        date_N=DateTime.DateString();
        time_N=DateTime.TimeString();
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Bind успешен! \n");
        //прием сообщения асинхронный сокет
        int a=WSAAsyncSelect(serv,Handle,WM_USER+1,FD_READ);
        if (a==SOCKET_ERROR)
          {
              Memo1->Lines->Add("все плохо");
              date_N=DateTime.DateString();
              time_N=DateTime.TimeString();
              fprintf(out2,"%s\t",date_N);
              fprintf(out2,"%s\t",time_N);
              fprintf(out2,"Все очень плохо! Программа закрыта\n");
              fclose(out2);
              WSACleanup();
              Close();
          }
      }
    }
  }
  }
fclose(out2);
po="";
}
//---------------------------------------------------------------------------
void __fastcall TFormo::Button2Click(TObject *Sender)
{
WSACleanup();
if (WSACleanup())
   Memo1->Lines->Add("Сокет закрыт");
}
//---------------------------------------------------------------------------
void __fastcall TFormo::N1Click(TObject *Sender)
{
TrayIcon1->Visible=false;
TrayIcon1->Restore();
AnsiString po;
po=Edit3->Text;
if (po=="")
     {
      po="5555";
      MessageDlg("Открыт порт по умолчанию: " +po,
               mtInformation, TMsgDlgButtons() << mbOK, 0);
      port=TryStrToInt(po,port);
     }
if (po!="")
  {
    if(!(TryStrToInt(po,port)))
        ShowMessage("число надо вводить!!!");
    else
    {
    if (port<0 || port>65535)
        ShowMessage("Не верный порт!!!");
  else
  {
// Инициализация сокета
  WSADATA wsaData;
  error=WSAStartup(MAKEWORD( 2, 0 ), &wsaData);
  if (error==SOCKET_ERROR)
     {
       Memo1->Lines->Add("произошла ошибка");
       WSACleanup();
       Close();
     }
  else
      {
        Memo1->Lines->Add("Инициализация прошла");
      }
// Обьявление сокета, присвоение адреса и порта
  sockaddr_in sock;
  sock.sin_family = AF_INET;
  sock.sin_port = htons(port);
  sock.sin_addr.s_addr = htonl(INADDR_ANY);
  serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (serv == SOCKET_ERROR)
    {
      Memo1->Lines->Add("Ошибка в сокете");
      WSACleanup();
      Close();
    }
  else
     {
        Memo1->Lines->Add("Сокет ок");
     }
// создание сокета
  error = bind(serv, (sockaddr*)&sock,sizeof(sock));
  if (error == SOCKET_ERROR)
    {
       Memo1->Lines->Add("Ошибка в bind");
       WSACleanup();
       Close();
    }
  else
      {
        GetLastError();
        Memo1->Lines->Add("bind успешен");
        //прием сообщения асинхронный сокет
        int a=WSAAsyncSelect(serv,Handle,WM_USER+1,FD_READ);
        if (a==SOCKET_ERROR)
          {
              Memo1->Lines->Add("все плохо");
              WSACleanup();
              Close();
          }
      }
    }
  }
  }
po="";
}
//---------------------------------------------------------------------------
void __fastcall TFormo::N2Click(TObject *Sender)
{
WSACleanup();
Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormo::Button6Click(TObject *Sender)
{
Memo1->Clear();
}
//----------------------------------------------------------------------------
void __fastcall TFormo::OnIconProc(TMessage & msg)
{
POINT p;
GetCursorPos( &p);//получение текущей позиции курсора мыши
switch ( msg.LParam)
       {
        case WM_RBUTTONDOWN:
          PopupMenu1->Popup(p.x,p.y);
          //popup->Popup( p.x, p.y);
          break;
        case WM_LBUTTONDBLCLK:
          //popup->Items[0].Click();
          PostMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
          SetForegroundWindow(Handle);
          break;
       }
}
//---------------------------------------------------------------------------
void __fastcall TFormo::CreateHint()
{
  if (!HW)
    {
      HW = new THintWindow(this);
      HW->Font->Color = clBlue;
      HW->ParentWindow = Handle;
    }
    int x,y,xx,yy;
//-----------------------* получение высоты меню пуск *----------------------
RECT WindowRect;
unsigned WindowHeight;
HWND WindowHandle;
WindowHandle = FindWindow("Shell_TrayWnd", NULL);
GetWindowRect(WindowHandle, &WindowRect);
WindowHeight = WindowRect.bottom - WindowRect.top+1;
int H = WindowHeight;
//---------------------------------------------------------------------------
    xx=Screen->Width;
    yy=Screen->Height;
    x=Screen->Width - 200;
    y=Screen->Height - (H+30);
  Timer1->Enabled=false;
  TRect (x,y,xx,yy);          // рисуем прямоугольник
  TRect rc = HW->CalcHintRect(Screen->Width,mesag,NULL);  // заполняем прямоугольник сообщением
  OffsetRect(&rc,x,y);
  HW->Repaint();
          switch (kod)    // определение цвета сообщения
                      {
                        case 0:
                              {
                                HW->Color = clPurple;
                                break;
                              }
                        case 1:
                              {
                                HW->Color = clRed;
                                break;
                              }
                        case 2:
                              {
                                HW->Color = clRed;
                                break;
                              }
                        case 3:
                              {
                                HW->Color = clYellow;
                                break;
                              }
                        case 4:
                              {
                                HW->Color = clAqua;
                                break;
                              }
                        case 5:
                              {
                                HW->Color = clSilver;
                                break;
                              }
                        case 6:
                              {
                                HW->Color = clMoneyGreen;
                                break;
                              }
                        case 7:
                              {
                                HW->Color = clWhite;
                                break;
                              }
                        default: break;
                      }
  HW->Refresh();
  HW->ActivateHint(rc,mesag);
  Timer1->Enabled=true;

}
//---------------------------------------------------------------------------
void __fastcall TFormo::Timer1Timer(TObject *Sender)
{
HW->ReleaseHandle();
Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TFormo::CheckBox2Click(TObject *Sender)
{
if (CheckBox2->Checked)
   {
     Label7->Visible = true;
     Edit4->Visible = true;
   }
else
   {
     Label7->Visible = false;
     Edit4->Visible = false;
   }
}
//---------------------------------------------------------------------------
//------------------------*Ведение лога*-------------------------------------

void __fastcall TFormo::LogsFiles(AnsiString Data_Priem, AnsiString Time_Priem,
                                  AnsiString from_host, AnsiString from_IP,
                                  AnsiString PORT,AnsiString code,
                                  AnsiString message)
{
FILE *out, *out1;
TDateTime DateTime = TDateTime::CurrentDateTime();
AnsiString date_sys="",file_str,uu,log_P,log_L,file_str1;
WORD m,y,d;
uu = FormatDateTime("yyyy_mm_dd", DateTime); //меняем формат даты
date_sys = uu;
dir_N = GetCurrentDir();                //получить директорию где наша программа
log_P = dir_N+"\\Logs";                //установить папки логов
log_L = log_P+"\\"+date_sys;           //папка по дате
if (!DirectoryExists(log_P))
   {
     if (!CreateDir(log_P))
        {
          MessageDlg("Папка не была создана!!!",
                      mtError, TMsgDlgButtons() << mbOK, 0);
        };
       //Memo1->Lines->Add("Папка создана Logs!!!");
   }
if (DirectoryExists(log_P))
{
if (!DirectoryExists(log_L))
   {
     if (!CreateDir(log_L))
        {
          MessageDlg("Папка не была создана!!!",
                      mtError, TMsgDlgButtons() << mbOK, 0);
        };
       //Memo1->Lines->Add("Папка создана Logs date!!!");
   }
}
if (DirectoryExists(log_L))
{
// открыть поток
file_str = log_L+"\\"+"!Logs_"+date_sys+".log";      //общий лог
file_str1 = log_L+"\\"+from_host+".log";            // лог по отправителю
out = fopen(file_str.c_str(),"a+");
  if (out == NULL)
    MessageDlg("Файл не был открыт!!!",
               mtError, TMsgDlgButtons() << mbOK, 0);
 else
     {
       fprintf(out,"%s\t",Time_Priem);
       fprintf(out,"%s\t",Data_Priem);
       fprintf(out,"%s\t",from_host);
       fprintf(out,"%s\t",from_IP);
       fprintf(out,"%s\t",PORT);
       fprintf(out,"%s\t",code);
       fprintf(out,"%s\t",message);
       fprintf(out,"\n");
     }
fclose(out);          // закрытие первого потока
out1 = fopen(file_str1.c_str(),"a+");
  if (out1 == NULL)
    MessageDlg("Файл не был открыт!!!",
               mtError, TMsgDlgButtons() << mbOK, 0);
 else
     {
       fprintf(out1,"%s\t",Time_Priem);
       fprintf(out1,"%s\t",Data_Priem);
       fprintf(out1,"%s\t",from_host);
       fprintf(out1,"%s\t",from_IP);
       fprintf(out1,"%s\t",PORT);
       fprintf(out1,"%s\t",code);
       fprintf(out1,"%s\t",message);
       fprintf(out1,"\n");
     }
fclose(out1);        // закрытие второго потока
}
date_sys="",file_str="";uu="";log_P="";log_L="";file_str1="";
}
//---------------------------------------------------------------------------
void __fastcall TFormo::N5Click(TObject *Sender)
{
TrayIcon1->Visible=true;
TrayIcon1->Minimize();
TrayIcon1->PopupMenuOn=imRightClickUp;
}
//---------------------------------------------------------------------------
void __fastcall TFormo::N4Click(TObject *Sender)
{
FILE *out2;
TDateTime DateTime = TDateTime::CurrentDateTime();
WSACleanup();
Shell_NotifyIcon( NIM_DELETE, &NID);
date_N=DateTime.DateString();
time_N=DateTime.TimeString();
out2 = fopen(Log_pro.c_str(),"a+");
 if (out2 == NULL)
    MessageDlg("Файл не был открыт!!!",
               mtError, TMsgDlgButtons() << mbOK, 0);
 else
     {
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Программа завершила свою работу \n");
     }
fclose(out2);
Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormo::N10Click(TObject *Sender)
{
    Form2 = new TForm2(Application);
    Form2->ShowModal();
    delete Form2;
}
//---------------------------------------------------------------------------
void __fastcall TFormo::FormActivate(TObject *Sender)
{
FILE *out0, *out2;
ini_F="";
dir_N = GetCurrentDir();
ini_F= dir_N + "\\cong.ini";
out0 = fopen(ini_F.c_str(),"r");
 if (out0 == NULL)
 {
    MessageDlg("Это первый запуск программы! Пожалуйста введите номер порта который нужно открыть и нажмите 'Ok' !",
              mtInformation, TMsgDlgButtons() << mbOK, 0);
    Button1->Visible=false;
    Button2->Visible=false;
    Button6->Visible=false;
    CheckBox2->Visible=false;
    Memo1->Visible=false;
    Button3->Visible=true;

 }
 else
    {
      fclose(out0);
      ini = new TIniFile(ini_F);
      Edit3->Text = ini->ReadString("MAIN","PORT","");
      Edit3->Enabled = false;
      TrayIcon1->Visible=true;
      TrayIcon1->Minimize();
      TDateTime DateTime = TDateTime::CurrentDateTime();
//открытие сокета задание порта
AnsiString po;
out2 = fopen(Log_pro.c_str(),"a+");
po=Edit3->Text;
if (po=="")
     {
      po="5555";
      MessageDlg("Открыт порт по умолчанию: " +po,
               mtInformation, TMsgDlgButtons() << mbOK, 0);
      port=TryStrToInt(po,port);
     }
if (po!="")
  {
    if(!(TryStrToInt(po,port)))
        ShowMessage("число надо вводить!!!");
    else
    {
    if (port<0 || port>65535)
        ShowMessage("Не верный порт!!!");
  else
  {
// Инициализация сокета
  WSADATA wsaData;
  error=WSAStartup(MAKEWORD( 2, 0 ), &wsaData);
  if (error==SOCKET_ERROR)
     {
       Memo1->Lines->Add("произошла ошибка");
       date_N=DateTime.DateString();
       time_N=DateTime.TimeString();
       fprintf(out2,"%s\t",date_N);
       fprintf(out2,"%s\t",time_N);
       fprintf(out2,"Произошла ошибка! Программа закрыта \n");
       fclose(out2);
       WSACleanup();
     }
  else
      {
        Memo1->Lines->Add("Инициализация прошла");
        date_N=DateTime.DateString();
        time_N=DateTime.TimeString();
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Инициализация прошла успешно \n");
      }
// Обьявление сокета, присвоение адреса и порта
  sockaddr_in sock;
  sock.sin_family = AF_INET;
  sock.sin_port = htons(port);
  sock.sin_addr.s_addr = htonl(INADDR_ANY);
  serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (serv == SOCKET_ERROR)
    {
      Memo1->Lines->Add("Ошибка в сокете");
      date_N=DateTime.DateString();
      time_N=DateTime.TimeString();
      fprintf(out2,"%s\t",date_N);
      fprintf(out2,"%s\t",time_N);
      fprintf(out2,"Ошибка в сокете! Программа закрыта\n");
      fclose(out2);
      WSACleanup();
    }
  else
     {
        Memo1->Lines->Add("Сокет ок");
        date_N=DateTime.DateString();
        time_N=DateTime.TimeString();
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Сокет успешен! \n");
     }
// создание сокета
  error = bind(serv, (sockaddr*)&sock,sizeof(sock));
  if (error == SOCKET_ERROR)
    {
       Memo1->Lines->Add("Ошибка в bind");
       date_N=DateTime.DateString();
       time_N=DateTime.TimeString();
       fprintf(out2,"%s\t",date_N);
       fprintf(out2,"%s\t",time_N);
       fprintf(out2,"Ошибка в bind! Программа закрыта \n");
       fclose(out2);
    }
  else
      {
        GetLastError();
        Memo1->Lines->Add("bind успешен");
        date_N=DateTime.DateString();
        time_N=DateTime.TimeString();
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Bind успешен! \n");
        //прием сообщения асинхронный сокет
        int a=WSAAsyncSelect(serv,Handle,WM_USER+1,FD_READ);
        if (a==SOCKET_ERROR)
          {
              Memo1->Lines->Add("все плохо");
              date_N=DateTime.DateString();
              time_N=DateTime.TimeString();
              fprintf(out2,"%s\t",date_N);
              fprintf(out2,"%s\t",time_N);
              fprintf(out2,"Все очень плохо! Программа закрыта\n");
              fclose(out2);
          }
      }
    }
  }
  }
fclose(out2);
po="";
    }

}
//---------------------------------------------------------------------------

void __fastcall TFormo::FormCreate(TObject *Sender)
{
TrayIcon1->PopupMenuOn=imRightClickUp;
}
//---------------------------------------------------------------------------

void __fastcall TFormo::N6Click(TObject *Sender)
{
    Form2 = new TForm2(Application);
    Form2->ShowModal();
    delete Form2;
}
//---------------------------------------------------------------------------
void __fastcall TFormo::Timer2Timer(TObject *Sender)
{
Memo1->Clear();
Timer2->Enabled= true;
}
//---------------------------------------------------------------------------

void __fastcall TFormo::FormDestroy(TObject *Sender)
{
FILE *out2;
TDateTime DateTime = TDateTime::CurrentDateTime();
WSACleanup();
Shell_NotifyIcon( NIM_DELETE, &NID);
date_N=DateTime.DateString();
time_N=DateTime.TimeString();
out2 = fopen(Log_pro.c_str(),"a+");
 if (out2 == NULL)
    MessageDlg("Файл не был открыт!!!",
               mtError, TMsgDlgButtons() << mbOK, 0);
 else
     {
        fprintf(out2,"%s\t",date_N);
        fprintf(out2,"%s\t",time_N);
        fprintf(out2,"Программа завершила свою работу \n");
     }
fclose(out2);
Close();
}
//---------------------------------------------------------------------------


void __fastcall TFormo::PopupMenu1Popup(TObject *Sender)
{
WSACleanup();
Memo1->Lines->Add("Остановка");
}
//---------------------------------------------------------------------------

