Exemplo n.º 1
0
static void tcpServer(uint16_t port, StreamType st)
{
    struct sockaddr_in serverAddr;
    int sockAddrSize = sizeof(serverAddr);
    int r;
    int on = 1;
    SOCKET s;

    s = socket(PF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET)
    {
        die("Unable to open server socket");
    }
    memset((char *) &serverAddr, 0, sockAddrSize);
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(port);
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, (socklen_t) sizeof(on));

    r = bind(s, (struct sockaddr *) &serverAddr, sockAddrSize);
    if (r == INVALID_SOCKET)
    {
        die("Unable to bind server socket");
    }

    r = listen(s, 10);
    if (r == INVALID_SOCKET)
    {
        die("Unable to listen to server socket");
    }

# ifdef O_NONBLOCK
    {
        int flags = fcntl(s, F_GETFL, 0);
        fcntl(s, F_SETFL, flags | O_NONBLOCK);
    }
# else
    {
        int ioctlOptionValue = 1;

        ioctl(s, FIONBIO, &ioctlOptionValue);
    }
# endif

    logDebug("TCP server fd=%d\n", s);
    setFdUsed(s, st);
}
Exemplo n.º 2
0
void acceptClient(SOCKET s, StreamType ct)
{
    SOCKET r;
    struct sockaddr_in clientAddr;
    socklen_t clientAddrLen;

    for (;;)
    {
        clientAddrLen = sizeof(clientAddr);
        r = accept(s, (struct sockaddr *) &clientAddr, &clientAddrLen);
        if (r == INVALID_SOCKET)
        {
            /* No socket ready, just ignore */
            return;
        }

        /* New client found, mark it as such */
        if (setFdUsed(r, ct) < 0)
        {
            /* Too many open clients, ignore */
            return;
        }
    }
}
Exemplo n.º 3
0
int main (int argc, char **argv)
{
    struct sigaction sa;

    setProgName(argv[0]);

    FD_ZERO(&activeSet);
    FD_ZERO(&readSet);
    FD_ZERO(&writeSet);

    setFdUsed(stdinfd, DATA_INPUT_STREAM);
    outputIdx = setFdUsed(stdoutfd, DATA_OUTPUT_STREAM);

    while (argc > 1)
    {
        if (strcasecmp(argv[1], "-d") == 0)
        {
            setLogLevel(LOGLEVEL_DEBUG);
            debug = 1;
        }
        else if (strcasecmp(argv[1], "-q") == 0)
        {
            setLogLevel(LOGLEVEL_ERROR);
        }
        else if (strcasecmp(argv[1], "-o") == 0)
        {
            outputIdx = setFdUsed(stdoutfd, DATA_OUTPUT_COPY);
        }
        else if (strcasecmp(argv[1], "-r") == 0)
        {
            outputIdx = setFdUsed(stdoutfd, DATA_OUTPUT_SINK);
        }
        else if (strcasecmp(argv[1], "--src-filter") == 0 && argc > 2)
        {
            srcFilter = argv[2];
            argc--, argv++;
        }
        else if (strcasecmp(argv[1], "--rate-limit") == 0)
        {
            rateLimit = true;
        }
        else if (strcasecmp(argv[1], "-p") == 0 && argc > 2)
        {
            unsigned int uPort;

            if (sscanf(argv[2], "%u", &uPort))
            {
                port = (uint16_t) uPort;
            }
            argc--, argv++;
        }
        else
        {
            fprintf(stderr, "usage: n2kd [-d] [-q] [-o] [-r] [--src-filter <srclist>] [--rate-limit] [-p <port>]\n\n"
                    "  -d                      debug mode\n"
                    "  -q                      quiet mode\n"
                    "  -o                      output mode, send all TCP client data to stdout (as well as stdin)\n"
                    "  -r                      restrict mode, send no data to stdout\n"
                    "  --src-filter <srclist>  restrict NMEA0183 stream to particular N2K sources\n"
                    "  --rate-limit            restrict NMEA0183 stream to one message per source per second\n"
                    "  -p <port>               Start servers at <port> instead of 2597\n\n"
                    COPYRIGHT);
            exit(1);
        }
        argc--, argv++;
    }

    startTcpServers();

    /*  Ignore SIGPIPE, this will let a write to a socket that's closed   */
    /*  at the other end just fail instead of raising SIGPIPE             */
    memset( &sa, 0, sizeof( sa ) );
    sa.sa_handler = SIG_IGN;
    sigaction( SIGPIPE, &sa, 0 );

    doServerWork();

    exit(0);
}
Exemplo n.º 4
0
int main (int argc, char **argv)
{
  struct sigaction sa;

  setProgName(argv[0]);

  FD_ZERO(&activeSet);
  FD_ZERO(&readSet);
  FD_ZERO(&writeSet);

  setFdUsed(stdinfd, DATA_INPUT_STREAM);
  outputIdx = setFdUsed(stdoutfd, DATA_OUTPUT_STREAM);

  while (argc > 1)
  {
    if (strcasecmp(argv[1], "-d") == 0)
    {
      setLogLevel(LOGLEVEL_DEBUG);
    }
    else if (strcasecmp(argv[1], "-q") == 0)
    {
      setLogLevel(LOGLEVEL_ERROR);
    }
    else if (strcasecmp(argv[1], "-o") == 0)
    {
      outputIdx = setFdUsed(stdoutfd, DATA_OUTPUT_COPY);
    }
    else if (strcasecmp(argv[1], "-r") == 0)
    {
      outputIdx = setFdUsed(stdoutfd, DATA_OUTPUT_SINK);
    }
    else if (strcasecmp(argv[1], "--src-filter") == 0 && argc > 2)
    {
      srcFilter = argv[2];
      argc--, argv++;
    }
    else if (strcasecmp(argv[1], "-p") == 0 && argc > 2)
    {
      unsigned int uPort;

      if (sscanf(argv[2], "%u", &uPort))
      {
        port = (uint16_t) uPort;
      }
      argc--, argv++;
    }
    else
    {
      fprintf(stderr, "usage: n2kd [-d] [-q] [--src-filter <srclist>] [-o] [-p <port>] [-r]\n\n"COPYRIGHT);
      exit(1);
    }
    argc--, argv++;
  }

  startTcpServers();

  /*  Ignore SIGPIPE, this will let a write to a socket that's closed   */
  /*  at the other end just fail instead of raising SIGPIPE             */
  memset( &sa, 0, sizeof( sa ) );
  sa.sa_handler = SIG_IGN;
  sigaction( SIGPIPE, &sa, 0 );

  doServerWork();

  exit(0);
}