diff -urN fping-2.4b2_to.orig/fping.c fping-2.4b2_to/fping.c
--- fping-2.4b2_to.orig/fping.c	2001-07-20 19:10:26.000000000 +0200
+++ fping-2.4b2_to/fping.c	2004-03-06 07:32:08.000000000 +0100
@@ -387,6 +387,9 @@
 	struct protoent *proto;
 	char *buf;
 	uid_t uid;
+	struct sockaddr_in src_addr;
+	char *src_ip;
+	int bind_to_local_ip = 0;
 
 	/* check if we are root */
 
@@ -409,6 +412,7 @@
 	if( s < 0 )
 		errno_crash_and_burn( "can't create raw socket" );
 
+
 	if( ( uid = getuid() ) )
 	{
 		seteuid( getuid() );
@@ -424,7 +428,7 @@
 
 	/* get command line options */
 
-	while( ( c = getopt( argc, argv, "gedhlmnqusaAvz:t:i:p:f:r:c:b:C:Q:B:" ) ) != EOF )
+	while( ( c = getopt( argc, argv, "gedhlmnqusaAvz:t:i:p:f:r:c:b:C:Q:B:I:" ) ) != EOF )
 	{
 		switch( c )
 		{
@@ -433,6 +437,13 @@
 				usage();
 
 			break;
+
+		case 'I':
+			if ( !(src_ip = optarg) )
+				usage();
+			bind_to_local_ip = 1;
+			
+			break;
 		
 		case 'r':
 			if( !( retry = ( u_int )atoi( optarg ) ) )
@@ -655,6 +666,17 @@
 	
 	trials = ( count > retry + 1 ) ? count : retry + 1;
 
+	if( bind_to_local_ip )
+	{
+		/* bind to the socket */
+		src_addr.sin_family = AF_INET;
+		src_addr.sin_addr.s_addr = inet_addr(src_ip);
+		src_addr.sin_port = htons(0);
+	
+		if (bind(s, (struct sockaddr *) &src_addr, sizeof(src_addr)) < 0)
+			errno_crash_and_burn( "can't bind source to address" );
+	}
+
 #if defined( DEBUG ) || defined( _DEBUG )
 	if( debugging & DBG_TRACE )
 		trace_flag = 1;

