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); }
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; } } }
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); }
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); }