Sending a broadcast message using raw sockets

Discussion in 'Python' started by Peter Steele, Jan 19, 2013.

  1. Peter Steele

    Peter Steele Guest

    I want to write a program in Python that sends a broadcast message using raw sockets. The system where this program will run has no IP or default route defined, hence the reason I need to use a broadcast message.

    I've done some searches and found some bits and pieces about using raw sockets in Python, but I haven't been able to find an example that explains how to construct a broadcast message using raw sockets.

    Any pointers would be appreciated.
     
    Peter Steele, Jan 19, 2013
    #1
    1. Advertisements

  2. Peter Steele wrote in
    in
    comp.lang.python:
    This is part of my Wake-On-Lan script:

    def WOL_by_mac( mac, ip = '<broadcast>', port = 9 ):
    import struct, socket

    a = mac.replace( ':', '-' ).split( '-' )
    addr = struct.pack( 'B'*6, *[ int(_, 16) for _ in a ] )
    msg = b'\xff' * 6 + addr * 16

    s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    s.setsockopt( socket.SOL_SOCKET, socket.SO_BROADCAST, 1 )
    s.sendto( msg, ( ip, port ) )
    s.close()


    The mac address is 6 pairs of hex digits seperated by '-' or ':'.

    http://en.wikipedia.org/wiki/Wake-on-LAN



    Rob.
     
    Rob Williscroft, Jan 21, 2013
    #2
    1. Advertisements

  3. Peter Steele

    Peter Steele Guest

    Thanks for the code sample. Does this code work if the box has no IP or default route assigned? I'm away from the office at the moment so I can't test this.
     
    Peter Steele, Jan 22, 2013
    #3
  4. Peter Steele wrote in
    in
    comp.lang.python:
    No idea, but the sockets system must be up and running before the
    card (interface) has an IP (otherwise how would it ever get assigned)
    and I presume DHCP works in a similar manner.

    However the "route assignemt" is irrelevent, broadcast messages never
    get routed.

    Rob
    --
     
    Rob Williscroft, Jan 22, 2013
    #4
  5. Peter Steele

    Peter Steele Guest

    I just tried running you code, and the "sendto" call fails with "Network isunreachable". That's what I expected, based on other tests I've done. That's why I was asking about how to do raw sockets, since tools like dhclient use raw sockets to do what they do. It can clearly be duplicated in Python,I just need to find some code samples on how to construct a raw packet.
     
    Peter Steele, Jan 22, 2013
    #5
  6. Peter Steele

    Peter Steele Guest

    In fact, I have used scapy in the past, but I am working in a restricted environment and don't have this package available. It provides tones more than I really need anyway, and I figured a simple raw socket send/receive can't be *that* hard. I may have to reverse engineer some C code, such as dhclient...
     
    Peter Steele, Jan 22, 2013
    #6
  7. Peter Steele

    Peter Steele Guest

    In fact, I have used scapy in the past, but I am working in a restricted environment and don't have this package available. It provides tones more than I really need anyway, and I figured a simple raw socket send/receive can't be *that* hard. I may have to reverse engineer some C code, such as dhclient...
     
    Peter Steele, Jan 22, 2013
    #7
  8. Yeah, I think you're working with something fairly esoteric there -
    bypassing the lower tiers of support (routing etc). Chances are you
    won't find any good Python examples, and C's all you'll have. Are you
    reasonably familiar with C?

    Point to note: Raw sockets *may* require special privileges. Some
    systems require that only root employ them, for security's sake.

    ChrisA
     
    Chris Angelico, Jan 22, 2013
    #8
  9. Peter Steele

    Peter Steele Guest

    Actually, I used to teach C, so yeah, I know it pretty well. :)

    Scapy is a possibility, I just need to add it to my environment (which doesn't have a C compiler). I can jury rig something though.
     
    Peter Steele, Jan 22, 2013
    #9
  10. Peter Steele

    Peter Steele Guest

    Actually, I used to teach C, so yeah, I know it pretty well. :)

    Scapy is a possibility, I just need to add it to my environment (which doesn't have a C compiler). I can jury rig something though.
     
    Peter Steele, Jan 22, 2013
    #10
  11. Peter Steele wrote in
    in
    comp.lang.python:
    Try
    s = socket.socket( socket.AF_INET, socket.SOCK_RAW )

    I tried this on windows and it needed admin privaleges to
    run.

    Rob.
    --
     
    Rob Williscroft, Jan 22, 2013
    #11
  12. Peter Steele

    peter Guest

    Yes, raw sockets need admin privileges, I knew that. The app I'm writing runs as root so that's not a problem. It runs during the %pre script stage of a kickstart controlled install.
     
    peter, Jan 23, 2013
    #12
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.