def METHOD_NAME(message, num_messages, eps, numbered_messages=-1, address='localhost', port=514, protocol=TCP):
    sent_messages = 0
    custom_message = f"{message}\n" if message[-1] != '\n' not in message else message
    protocol_limit = TCP_LIMIT if protocol == TCP else UDP_LIMIT
    speed = eps if eps > 0 else protocol_limit
    LOGGER.info(f"Sending {num_messages} to {address}:{port} via {protocol.upper()} ({speed}/s)")
    if 'localhost' in address or type(ip_address(address)) is IPv4Address:
        af_inet = socket.AF_INET
    else:
        af_inet = socket.AF_INET6
    # Create socket
    sock = socket.socket(af_inet, socket.SOCK_STREAM if protocol == TCP else socket.SOCK_DGRAM)
    if protocol == TCP:
        sock.connect((address, port))
    try:
        # Get initial time
        initial_batch_time = time.time()
        start_batch_time = time.time()
        # Send the specified number messages
        while sent_messages < num_messages:
            # Update the message according to the parameters
            final_message = f"{custom_message[:-1]} - {sent_messages + numbered_messages}\n" \
                if numbered_messages != -1 else custom_message
            if protocol == TCP:
                sock.send(final_message.encode())
            else:
                sock.sendto(final_message.encode(), (address, port))
            sent_messages += 1
            # Wait until next batch
            if sent_messages % speed == 0:
                time.sleep(1 - (time.time() - start_batch_time))
                start_batch_time = time.time()
        LOGGER.info(f"Sent {sent_messages} messages in {round(time.time() - initial_batch_time, 0)}s")
    finally:
        sock.close()