26 #include <netinet/in.h> 35 #include <sys/socket.h> 46 extern char *
optarg, *opterr;
54 #define DFLT_SERVICE "PIT" 56 #define INVALID_DESC -1 60 #define VALIDOPTS "vh:p:" 69 static int openSckt(
const char *service,
73 static void pit(
int tSckt[ ],
94 "Usage: %s [-v] -p service \n", \ 105 if ( (expr) == -1 ) \ 108 "%s (line %d): System call ERROR - %s.\n", \ 111 strerror( errno ) ); \ 142 pgmName = strrchr( argv[ 0 ],
'/' );
148 while ( ( opt = getopt( argc, argv,
VALIDOPTS ) ) >= 0 )
187 if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) )
201 "%s: No sockets opened... terminating.\n",
233 const char *protocol,
239 struct addrinfo *aiHead;
240 struct addrinfo hints = { .ai_flags = AI_PASSIVE,
241 .ai_family = PF_UNSPEC };
242 size_t maxDescs = *descSize;
246 while ( *descSize > 0 )
253 if ( strcmp( protocol,
"tcp" ) == 0 )
255 hints.ai_socktype = SOCK_STREAM;
256 hints.ai_protocol = IPPROTO_TCP;
258 else if ( strcmp( protocol,
"udp" ) == 0 )
260 hints.ai_socktype = SOCK_DGRAM;
261 hints.ai_protocol = IPPROTO_UDP;
266 "%s (line %d): ERROR - Unknown transport " 267 "layer protocol \"%s\".\n",
280 if ( ( aiErr = getaddrinfo( NULL,
286 "%s (line %d): ERROR - %s.\n",
289 gai_strerror( aiErr ) );
297 ( ai != NULL ) && ( *descSize < maxDescs );
307 "Setting up a passive socket based on the " 308 "following address info:\n" 309 " ai_flags = %#02X\n" 310 " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" 311 " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" 312 " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" 313 " ai_addrlen = %d (sockaddr_in = %lu, " 314 "sockaddr_in6 = %lu)\n",
326 sizeof(
struct sockaddr_in ),
327 sizeof(
struct sockaddr_in6 ) );
333 getnameinfo( ai->ai_addr,
339 NI_NUMERICHOST | NI_NUMERICSERV );
340 switch ( ai->ai_family )
344 struct sockaddr_in *p = (
struct sockaddr_in*) ai->ai_addr;
346 " ai_addr = sin_family: %d (AF_INET = %d, " 359 struct sockaddr_in6 *p = (
struct sockaddr_in6*) ai->ai_addr;
361 " ai_addr = sin6_family: %d (AF_INET = %d, " 365 " sin6_flowinfo: %d\n" 366 " sin6_scope_id: %d\n",
379 "%s (line %d): ERROR - Unknown protocol family (%d).\n",
383 freeaddrinfo( aiHead );
391 CHK( desc[ *descSize ] = socket( ai->ai_family,
399 if ( ai->ai_family == PF_INET6 )
401 #if defined( IPV6_V6ONLY ) 406 CHK( setsockopt( desc[ *descSize ],
410 sizeof( v6Only ) ) );
428 "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket " 429 "option. Closing IPv6 %s socket.\n",
432 ai->ai_protocol == IPPROTO_TCP ?
"TCP" :
"UDP" );
440 CHK( bind( desc[ *descSize ],
447 if ( ai->ai_socktype == SOCK_STREAM )
449 CHK( listen( desc[ *descSize ],
460 if (
verbose && ( ai != NULL ) )
463 "%s (line %d): WARNING - Some address records were " 464 "not processed due to insufficient array space.\n",
471 freeaddrinfo( aiHead );
490 static void pit(
int tSckt[ ],
498 size_t descSize = tScktSize + uScktSize;
501 struct sockaddr *sadr;
503 struct sockaddr_storage sockStor;
508 unsigned long long secs;
513 desc = malloc( descSize *
sizeof(
struct pollfd ) );
517 "%s (line %d): ERROR - %s.\n",
520 strerror( ENOMEM ) );
526 for ( idx = 0; idx < descSize; idx++ )
528 desc[ idx ].fd = idx < tScktSize ? tSckt[ idx ]
529 : uSckt[ idx - tScktSize ];
530 desc[ idx ].events = POLLIN;
531 desc[ idx ].revents = 0;
556 LARGE_INTEGER freq,counter;
557 double wintime,bigcounter;
563 QueryPerformanceFrequency(&freq);
564 QueryPerformanceCounter(&counter);
565 bigcounter=(double)counter.HighPart *(
double)0xffffffff +
566 (double)counter.LowPart;
567 wintime = (
double)(bigcounter/(double)freq.LowPart);
568 secs = (
long long)(wintime * 1000000);
571 secs = ((
unsigned long long)
tm.
tv_sec * 1000000)
580 for ( idx = 0; idx < descSize; idx++ )
582 switch ( desc[ idx ].revents )
591 "%s (line %d): ERROR - Invalid poll event (%#02X).\n",
594 desc[ idx ].revents );
601 if ( idx < tScktSize )
607 sadrLen =
sizeof( sockStor );
608 sadr = (
struct sockaddr*) &sockStor;
609 CHK( newSckt = accept( desc[ idx ].
fd,
612 CHK( shutdown( newSckt,
621 "Sockaddr info for new TCP client:\n" 622 " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" 623 " addr len = %d (sockaddr_in = %lu, " 624 "sockaddr_in6 = %lu)\n",
629 sizeof(
struct sockaddr_in ),
630 sizeof(
struct sockaddr_in6 ) );
640 NI_NUMERICHOST | NI_NUMERICSERV );
645 switch ( sadr->sa_family )
649 struct sockaddr_in *p = (
struct sockaddr_in*) sadr;
651 " sin_addr = sin_family: %d\n" 661 struct sockaddr_in6 *p = (
struct sockaddr_in6*) sadr;
663 " sin6_addr = sin6_family: %d\n" 666 " sin6_flowinfo: %d\n" 667 " sin6_scope_id: %d\n",
678 "%s (line %d): ERROR - Unknown address " 698 }
while ( (
count < 0 ) && (
errno == EINTR ) );
716 sadrLen =
sizeof( sockStor );
717 sadr = (
struct sockaddr*) &sockStor;
729 ssize_t rBytes =
count;
731 "%s: UDP datagram received (%ld bytes).\n",
736 fputc( bfr[ rBytes -
count-- ],
739 if ( bfr[ rBytes-1 ] !=
'\n' )
740 fputc(
'\n', stdout );
746 "Remote client's sockaddr info:\n" 747 " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" 748 " addr len = %d (sockaddr_in = %lu, " 749 "sockaddr_in6 = %lu)\n",
754 sizeof(
struct sockaddr_in ),
755 sizeof(
struct sockaddr_in6 ) );
765 NI_NUMERICHOST | NI_NUMERICSERV );
766 switch ( sadr->sa_family )
770 struct sockaddr_in *p = (
struct sockaddr_in*) sadr;
772 " sin_addr = sin_family: %d\n" 782 struct sockaddr_in6 *p = (
struct sockaddr_in6*) sadr;
784 " sin6_addr = sin6_family: %d\n" 787 " sin6_flowinfo: %d\n" 788 " sin6_scope_id: %d\n",
799 "%s (line %d): ERROR - Unknown address " 816 count = sendto( desc[ idx ].
fd,
822 }
while ( (
count < 0 ) && (
errno == EINTR ) );
827 desc[ idx ].revents = 0;
static const char * pgmName
int main(int argc, char *argv[])
static void pit(int tSckt[], size_t tScktSize, int uSckt[], size_t uScktSize)
static char servBfr[NI_MAXSERV]
ssize_t write(int fd, const void *buf, size_t count)
static char hostBfr[NI_MAXHOST]
static int openSckt(const char *service, const char *protocol, int desc[], size_t *descSize)
int gettimeofday(void *ptr1, void *ptr2)