解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python で LAN (ローカルエリアネットワーク)内のオンラインユーザーを探す



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


通信系のアプリを作ったらオンラインのユーザーを探さないといけないよな…と、まだ全然通信出来た試しも無いのにやってみようと思い立ちました。

結論を言うと動作が遅くて使い物にはならないプログラムが出来上がってしまいました。

書いたプログラムは LAN 内の IP アドレスからホストの逆引きを総当たりして逆引き出来たらオンラインで逆引き出来なければオフラインと判断するものです。

私のような初心者が道を間違えぬようにまとめておきます。



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# ホスト一覧取得プログラム
###############################################################################
#==============================================================================
# ライブラリインポート
#==============================================================================
import socket
 
host = socket.gethostname()     # 自分自身のホスト名取得
ip = socket.gethostbyname(host) # 自分自身の IP アドレス取得
 
# 自分自身の IP アドレスのネットワーク部の取得
pos1 = ip.find('.')
pos1 = ip.find('.', pos1 + 1)
pos1 = ip.find('.', pos1 + 2)
network = ip[0:pos1+1]
 
# C クラスのプライベート IP アドレスを想定して全 IP に対してホスト名逆引きを試みる
for i in range(256):
    ip = str(network) + str(i) # IP アドレス作成
    print(ip + ' : ', end='')  # 表示
    try:
        host = socket.gethostbyaddr(ip) # IP からホスト名逆引き
        print(socket.gethostbyaddr(ip)) # 表示
    except socket.herror:
        print('') # エラーなら次の IP を逆引きする
        continue



結果

オンラインの端末を探すことは出来ていますが、動作がとても遅く、強制終了してしまいました。


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/messenger030.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
192.168.220.0 :
192.168.220.1 :
192.168.220.2 :
192.168.220.3 : ('HOST-NAME', [], ['192.168.220.3'])
192.168.220.4 : ('HOST-NAME', [], ['192.168.220.4'])
192.168.220.5 :
192.168.220.6 :
192.168.220.7 :
192.168.220.8 :
192.168.220.9 :
192.168.220.10 :
192.168.220.11 :
192.168.220.12 :
192.168.220.13 :
192.168.220.14 :
192.168.220.15 :
192.168.220.16 :
192.168.220.17 :
192.168.220.18 :
192.168.220.19 :
192.168.220.20 :



コメント

通信系のアプリなんかではアプリ間でオンラインユーザーの確認をしているのだろうと思いました。

アプリ間の通信についてもっと勉強します。



以上