python:socket:programming

Python ソケット プログラミング

Wake-on-LAN - Wikipedia

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import socket
import struct
from traceback import print_exc
 
DEFAULT_PORT = 7 # 7 or 9 or 30000 ?
#BROADCAST_IPADDR = '<broadcast>'
BROADCAST_IPADDR = '255.255.255.255'
 
def send_magic_packet(mac_addr, port=DEFAULT_PORT):
    # create socket
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        # parse address
        wol_mac = mac_addr.upper().replace('-', '').replace(':', '')
        if len(wol_mac) != 12:
            raise Exception('invalid MAC address format: {}'.format(mac_addr))
        buf = b'f' * 2 * 6 + (wol_mac * 16).encode()
        # encode to magic packet payload
        magic_packet = b''
        for i in range(0, len(buf), 2):
            magic_packet += struct.pack('B', int(buf[i:i + 2], 16))
 
        # send magic packet
        print('Sending magic packet for: {}, broadcast port is {} ...'.format(mac_addr, port))
        sock.sendto(magic_packet, (BROADCAST_IPADDR, port))
 
def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('mac_address', help='Target MAC address.', type=str)
    parser.add_argument('-p', '--port',
                        help='Default broadcast port is {}.'.format(DEFAULT_PORT),
                        default=DEFAULT_PORT, type=int)
    return parser.parse_args()
 
def main():
    args = parse_args()
    mac_addr = args.mac_address
    port = args.port
 
    try:
        #mac_addr = "AA:BB:CC:DD:EE:FF"
        send_magic_packet(mac_addr, port)
 
    except BaseException:
        print_exc()
 
if __name__ == '__main__':
    main()

実行例:

$ python wol.py
usage: wol.py [-h] [-p port] mac_address
wol.py: error: the following arguments are required: mac_address
$ python wol.py -h
usage: wol.py [-h] [-p port] mac_address
 
positional arguments:
  mac_address           Target MAC address.
 
optional arguments:
  -h, --help            show this help message and exit
  -p port, --port port  Default broadcast port is 7.

ターゲットの MAC address にマジックパケットを送信する。

$ python wol.py 68:96:7b:07:21:55

ターゲットの PC が起動する。

Sending magic packet for: 68:96:7B:07:21:55, broadcast port is 7 ...
  • python/socket/programming.txt
  • 最終更新: 2021/06/25 15:48
  • by ともやん