ValentinBELYN / icmplib

Easily forge ICMP packets and make your own ping and traceroute.
GNU Lesser General Public License v3.0
265 stars 46 forks source link

Make payload more flexible #83

Closed damluk closed 2 months ago

damluk commented 2 months ago

I would like to have more influence on packet payload for a ping sequence. I can think of at least two ways:

ValentinBELYN commented 2 months ago

Hi,

The use case seems quite limited to me (to be implemented directly in this library).

From what I understand, you want to send different payloads for each of your requests. Given that an ICMPRequest object is single-use, passing a payload generator to ICMPRequest is of no interest. To achieve what you want, you would need to implement your own ping function where each request could have different payloads.

You could use something like:

from icmplib import ICMPv4Socket, ICMPRequest, Host, ICMPLibError

def generate_payload():
    # Your code here

def ping(address, count=4, interval=1, timeout=2, id=0, source=None,
         privileged=True, **kwargs):

    packets_sent = 0
    rtts = []

    with ICMPv4Socket(source, privileged) as sock:
        for sequence in range(count):
            if sequence > 0:
                sleep(interval)

            request = ICMPRequest(
                destination=address,
                id=id,
                sequence=sequence,
                payload=generate_payload(),
                **kwargs)

            try:
                sock.send(request)
                packets_sent += 1

                reply = sock.receive(request, timeout)
                reply.raise_for_status()

                rtt = (reply.time - request.time) * 1000
                rtts.append(rtt)

            except ICMPLibError:
                pass

    return Host(address, packets_sent, rtts)

Does this meet your needs?

damluk commented 2 months ago

I will try it, thanks.