#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

int main(int argc, char *argv[])
  {
  struct sockaddr_in addr;
  struct servent *serv;
  int sock, i;
  unsigned long begin, end, curr;

  if (argc < 3)
    {
    fprintf(stderr, "usage: %s <begin> <end>\n", argv[0]);
    exit(1);
    }

  /* numerische IP-Adressen ermitteln */
  begin = ntohl(inet_addr(argv[1]));
  end = ntohl(inet_addr(argv[2]));

  /* Anfangadresse < Endadresse sicherstellen */
  if (begin > end)
    {
    curr = end; end = begin; begin = curr;
    }

  /* Adressbereich abscannen */
  memset( &addr, 0, sizeof (addr));
  for (curr = begin; curr <= end; curr++)
    {
    addr.sin_addr.s_addr = htonl(curr);
    printf("%s:\n", inet_ntoa(addr.sin_addr));

    /* well known ports abscannen */
    for (i = 0; i < 1024; i++)
      {
      sock = socket(PF_INET, SOCK_STREAM, 0);
      if (sock == -1)
        {
        perror("socket() failed");
        exit(1);
        }
      addr.sin_addr.s_addr = htonl(curr);
      addr.sin_port = htons(i);
      addr.sin_family = AF_INET;
      /* aktuelle Portnummer anzeigen */
      printf("--> %4i\r", i);
      fflush(stdout);

      if (!connect(sock, (struct sockaddr*)&addr, sizeof(addr)))
        {
        /* Namen des Services zum Port ermitteln */
        serv = getservbyport(addr.sin_port, "tcp");
        if (serv)
          printf("%i (%s) open\n", i, serv->s_name);
        else
          printf("%i (unknown) open\n", i);
        }

      close(sock);
      }
    puts("\r        \n");
    }
  return 0;
  }

