コード例 #1
0
ファイル: cs2eth.c プロジェクト: GBert/railroad
static void ProcessSystemData(Cs2ethStruct *Data, MrIpcCmdType *CmdFrame)
{  char UdpFrame[MR_CS2_UDP_LENGTH];
   MrCs2CanDataType CanMsg;
   int i;
   ClientInfo *OneClient;

   if (MrIpcGetCommand(CmdFrame) != MrIpcCmdNull)
   {
      switch (MrIpcGetCommand(CmdFrame))
      {
         case MrIpcCmdRequestLocName:
         case MrIpcCmdRequestLocInfo:
            break;
         default:
            MrIpcDecodeToCan(CmdFrame, &CanMsg);
            if (Cs2ethGetVerbose(Data))
            {
#ifdef TRACE
               if (Cs2ethGetTrace(Data))
                  MrCs2Trace(&CanMsg);
#endif
               printf("send can data 0x%lx %d to UDP client\n    ",
                      MrCs2GetId(&CanMsg), MrCs2GetDlc(&CanMsg));
               for (i = 0; i < 8; i++)
                  printf("0x%02x ", CanMsg.Data[i]);
               printf("\n    hash 0x%x resp 0x%x cmd 0x%x prio 0x%x\n",
                      MrCs2GetHash(&CanMsg), MrCs2GetResponse(&CanMsg),
                      MrCs2GetCommand(&CanMsg), MrCs2GetPrio(&CanMsg));
            }
            MrEthCs2Encode(UdpFrame, &CanMsg);
            if (Cs2ethGetUdpConnected(Data))
            {
               if ((MrIpcGetReceiverSocket(CmdFrame) == MR_IPC_SOCKET_ALL) ||
                   (MrIpcGetReceiverSocket(CmdFrame) == Cs2ethGetOutsideUdpSock(Data)))
               {
                  if (Cs2ethGetVerbose(Data))
                     puts("send as udp");
                  MrEthCs2SendTo(Cs2ethGetOutsideUdpSock(Data),
                                 (struct sockaddr_in *)&(Cs2ethGetClientAddr(Data)),
                                 UdpFrame);
               }
            }
            MengeInitIterator(Cs2ethGetClientIter(Data),
                              Cs2ethGetClients(Data));
            OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data));
            while (OneClient != (ClientInfo *)NULL)
            {
               if ((MrIpcGetReceiverSocket(CmdFrame) == MR_IPC_SOCKET_ALL) ||
                   (MrIpcGetReceiverSocket(CmdFrame) == OneClient->ClientSock))
               {
                 if (Cs2ethGetVerbose(Data))
                     printf("send to tcp socket %d\n", OneClient->ClientSock);
                  MrEthCs2Send(OneClient->ClientSock, UdpFrame);
               }
               OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data));
            }
            break;
      }
   }
}
コード例 #2
0
ファイル: cs2eth.c プロジェクト: GBert/railroad
static void Stop(Cs2ethStruct *Data)
{  ClientInfo *OneClient;

   if (Cs2ethGetVerbose(Data))
      puts("stop mrcs2eth");
   MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data));
   OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data));
   while (OneClient != (ClientInfo *)NULL)
   {
      MrEthCs2Close(OneClient->ClientSock);
      OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data));
   }
   MrIpcClose(Cs2ethGetClientSock(Data));
   MrEthCs2Close(Cs2ethGetOutsideUdpSock(Data));
   MrEthCs2Close(Cs2ethGetOutsideTcpSock(Data));
}
コード例 #3
0
void CanMemberDelAllInvalid(CanMemberStruct *Data)
{  Menge *MemberToDel;
   MengeIterator IterToDel;
   CollectStruct Collector;
   unsigned long *UidToDel;

   MemberToDel = MengeCreate();
   MengeInit(MemberToDel, MemberDelCmp, (MengeDelCbFkt)free);
   Collector.CanMemberDb = CanMemberGetCanMemberDb(Data);
   Collector.MemberToDel = MemberToDel;
   MapWalkAscend(CanMemberGetCanMemberDb(Data), (MapWalkCbFkt)CollectInvalid,
                 (void *)&Collector);
   MengeInitIterator(&IterToDel, MemberToDel);
   UidToDel = (unsigned long *)MengeFirst(&IterToDel);
   while (UidToDel != 0l)
   {
      MapDel(CanMemberGetCanMemberDb(Data), (MapKeyType)*UidToDel);
      UidToDel = (unsigned long *)MengeNext(&IterToDel);
   }
   MengeDestroy(MemberToDel);
}
コード例 #4
0
ファイル: cs2eth.c プロジェクト: GBert/railroad
static void ForwardOutsideData(Cs2ethStruct *Data, char *UdpFrame,
                               int SenderSocket)
{  ClientInfo *OneClient;

   if ((Cs2ethGetUdpConnected(Data)) &&
       (SenderSocket != Cs2ethGetOutsideUdpSock(Data)))
   {
      if (Cs2ethGetVerbose(Data))
         puts("forward as udp");
      MrEthCs2Send(Cs2ethGetOutsideUdpSock(Data), UdpFrame);
   }
   MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data));
   OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data));
   while (OneClient != (ClientInfo *)NULL)
   {
      if (SenderSocket != OneClient->ClientSock)
      {
         if (Cs2ethGetVerbose(Data))
            printf("forward to tcp socket %d\n", OneClient->ClientSock);
         MrEthCs2Send(OneClient->ClientSock, UdpFrame);
      }
      OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data));
   }
}
コード例 #5
0
ファイル: cs2eth.c プロジェクト: GBert/railroad
void Cs2ethRun(Cs2ethStruct *Data)
{  fd_set ReadFds;
   int RetVal, HighFd;
   struct timeval SelectTimeout;
   time_t Now;
   ClientInfo *OneClient;

   if (Start(Data))
   {
      if (Cs2ethGetVerbose(Data))
         puts("run mrcs2eth");
      while (Loop)
      {
         FD_ZERO(&ReadFds);
         HighFd = 0;
         if (Cs2ethGetVerbose(Data))
            printf("add client socket %d\n", Cs2ethGetClientSock(Data));
         FD_SET(Cs2ethGetClientSock(Data), &ReadFds);
         if (Cs2ethGetClientSock(Data) > HighFd)
            HighFd = Cs2ethGetClientSock(Data);
         if (Cs2ethGetVerbose(Data))
            printf("add outside udp socket %d\n", Cs2ethGetOutsideUdpSock(Data));
         FD_SET(Cs2ethGetOutsideUdpSock(Data), &ReadFds);
         if (Cs2ethGetOutsideUdpSock(Data) > HighFd)
            HighFd = Cs2ethGetOutsideUdpSock(Data);
         if (Cs2ethGetVerbose(Data))
            printf("add outside tcp socket %d\n", Cs2ethGetOutsideTcpSock(Data));
         FD_SET(Cs2ethGetOutsideTcpSock(Data), &ReadFds);
         if (Cs2ethGetOutsideTcpSock(Data) > HighFd)
            HighFd = Cs2ethGetOutsideTcpSock(Data);
         MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data));
         OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data));
         while (OneClient != (ClientInfo *)NULL)
         {
            if (Cs2ethGetVerbose(Data))
               printf("add app socket %d\n", OneClient->ClientSock);
            FD_SET(OneClient->ClientSock, &ReadFds);
            if (OneClient->ClientSock > HighFd)
               HighFd = OneClient->ClientSock;
            OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data));
         }
         SelectTimeout.tv_sec = SELECT_TIMEOUT;
         SelectTimeout.tv_usec = 0;
         if (Cs2ethGetVerbose(Data))
            printf("wait for %d fd, max %ld s\n", HighFd, SelectTimeout.tv_sec);
         RetVal = select(HighFd + 1, &ReadFds, NULL, NULL, &SelectTimeout);
         if (Cs2ethGetVerbose(Data))
            printf("select liefert %d\n", RetVal);
         if (((RetVal == -1) && (errno == EINTR)) || (RetVal == 0))
         {
            Now = time(NULL);
            if (Cs2ethGetVerbose(Data))
               printf("interrupt at %s\n", asctime(localtime(&Now)));
         }
         else if (RetVal < 0)
         {
            if (Cs2ethGetVerbose(Data))
               puts("error in main loop");
            Loop = FALSE;
         }
         else
         {
            if (FD_ISSET(Cs2ethGetClientSock(Data), &ReadFds))
            {
               if (Cs2ethGetVerbose(Data))
                  puts("data on cmd socket to drehscheibe");
               HandleSystemData(Data);
            }
            if (FD_ISSET(Cs2ethGetOutsideUdpSock(Data), &ReadFds))
            {
               if (Cs2ethGetVerbose(Data))
                  puts("data on udp socket to remote");
               HandleOutsideData(Data);
            }
            if (FD_ISSET(Cs2ethGetOutsideTcpSock(Data), &ReadFds))
            {
               if (Cs2ethGetVerbose(Data))
                  puts("data on tcp socket server to remote");
               HandleOutsideTcpConnection(Data);
            }
            MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data));
            OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data));
            while (OneClient != (ClientInfo *)NULL)
            {
               if (Cs2ethGetVerbose(Data))
                  printf("check client socket %d\n", OneClient->ClientSock);
               if (FD_ISSET(OneClient->ClientSock, &ReadFds))
               {
                  if (Cs2ethGetVerbose(Data))
                     puts("data on app socket to remote");
                  if (HandleAppData(Data, OneClient))
                     OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data));
                  else
                     OneClient = (ClientInfo *)MengeIterRemove(Cs2ethGetClientIter(Data));
               }
               else
                  OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data));
            }
         }
      }
      Stop(Data);
   }
}