www.pudn.com > src00 > SND.C, change:2001-11-24,size:2004b


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

#define MS		1000
#define PORT		8000
#define BUF_SIZE	2000
#define PKT_MAX		1

int	count = 0;

int send_proc(int sd, char *addr, int cnt, int delay, int size)
{
	struct sockaddr_in sin;
	int	i;
	char	buf[BUF_SIZE];
	struct	hostent *he;
	int	pkt_cnt = 0;

	he = gethostbyname(addr);
	if(he==NULL) {
		perror("gethostbyname()");
		return -1;
	}

	printf("send_to: %u.%u.%u.%u\n", 
		(unsigned char)he->h_addr[0],
		(unsigned char)he->h_addr[1],
		(unsigned char)he->h_addr[2],
		(unsigned char)he->h_addr[3]);

	bzero(&sin, sizeof(sin));
	sin.sin_family = AF_INET;
/*	sin.sin_len = sizeof(sin); */
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = *(unsigned long *)he->h_addr;

	for(i=0; i<sizeof(buf); i++) 
		buf[i] = i%256;

	while(1) {
		int	ret;

		ret = sendto(sd, buf, size, 0, (struct sockaddr *)&sin, 
				sizeof(sin));
		if(ret<0) {
			perror("sendto()");
			usleep(delay*MS);
			continue;
		} else
			count ++;
		pkt_cnt ++;
		if(pkt_cnt>=cnt) {
			usleep(delay*MS);
			pkt_cnt = 0;
		}
	}
}


int create_sock(void)
{
	int	sd;

	sd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sd<0) {
		perror("socket()");
		return -1;
	}
	return sd;
}

void sigint(int sig)
{
	printf("count = %d\n", count);
	exit(0);
}

int main(int argc, char **argv)
{
	pid_t	pid;
	int	sd = create_sock();
	int	delay;
	int	pktcnt;
	int	size;

	if(argc!=5) {
		printf("Usage: %s host PktCount DelayValue PktSize\n", 
			argv[0]);
		exit(0);
	}

	signal(SIGINT, sigint);

	pktcnt = atoi(argv[2]);
	delay = atoi(argv[3]);
	size = atoi(argv[4]);
	if(size  1)
		size = 1;

	if(delay<0 || delay>1000) {
		printf("DelayValue must >=0 && =1000\n");
		exit(1);
	}
			
	if(sd<0)
		exit(1);

	printf("packet size: %d\n", size);
	printf("send speed: %d pps\n", pktcnt*1000/delay);

	send_proc(sd, argv[1], pktcnt, delay, size);
	return 0;
}