今月いっぱいで集中して書かないといけない文章が2つあり,あまり他の事に手が回っていない.
昨日一応1つは手を離れた(チェックしてもらってまた戻ってくるけど)ので,
気になっていた Python 通信の勉強の続きを少し(残っている1つの方が大変なんだけど).
この Python のプログラミングも8月中には目的のところもまで持っていきたい.




プログラム間通信の仕方を勉強していた.
前回までに UDP を用いたブロードキャストの仕方は学んだので,それを少しだけ拡張する.

サーバー側のプログラムが,クライントからのブロードキャストメッセージを待ち受けているのは前回と同じ.
でも,受け取ったメッセージが "Where are you?" だったときは,
サーバー側は自分の IP アドレスをプロードキャスで返信して,クライアントに知らせるようにした.

クライアント側は,"Hello!" と "Where are you?" の2種類のメッセージをブロードキャストする.
サーバー側から "I'm xxx" と返信があれば,それを受信して終了メッセージを発信して終了する.

サーバー側は終了メッセージを受信したら終了する.


クライント側では,送信と受信を並行して行いたいので,これも以前に学んだ fork を使って,プロセスを複製した.
子プロセスはブロードキャスト発信,親プロセスは受信のため待機する.
親プロセスがサーバーからの返信を受信したら,子プロセスを kill して自分自身も終了する.



=== Server === === Client ===
from socket import *
from time import sleep
import sys

HOST = ''...
PORT = 5008
MYADDRESS = "192.168.50.18".
BROAD_ADDRESS = "192.168.50.255"

s =socket(AF_INET,SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
s.bind((HOST, PORT))

while True:
msg, address = s.recvfrom(8192)
if msg == ".":
print "Received the end signal"
break

print "recieve:", msg, "from", address[0]
if msg == "Where are you?":
print "Let the client know my address"
s.sendto("I'm "+
MYADDRESS, (BROAD_ADDRESS, PORT))

sleep(1)

s.close()
sys.exit()
 
from socket import *
from time import sleep
import sys
import os

HOST = ''
PORT = 5008
BROAD_ADDRESS = "192.168.50.255"

s =socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
s.bind((HOST, PORT))

pid = os.fork()

if pid == 0:
print "child process"
while True:
msg = "Hello!"
print "send:", msg
s.sendto(msg, (BROAD_ADDRESS, PORT))

sleep(2)

msg = "Where are you?"
print "send:", msg
s.sendto(msg, (BROAD_ADDRESS, PORT))

sleep(1)

else:
print "parent process"
while True:
msg, address = s.recvfrom(8192)
if msg.find("I'm") + 1:
print "recieve:", msg, "from", address[0]
s.sendto(".", (BROAD_ADDRESS, PORT))
print "Send the end signal"
os.kill(pid, 8)
break

sleep(1.3)

s.close()
sys.exit()


上記 client と sever をそれぞれ同一ネットワーク上に存在する1台のマシン(計2台)で実行してみる.
実行結果は以下のようになる.

=== Server1 === === Client1 ===
7:53.barbaresco[100269]python udp_server.py
recieve: Hello! from 192.168.50.191
recieve: Where are you? from 192.168.50.191
Let the client know my address
recieve: I'm 192.168.50.18 from 192.168.50.11
recieve: Hello! from 192.168.50.191
Received the end signal

 
7:53.soave[114]python udp_client.py  
parent process
child process
send: Hello!
send: Where are you?
send: Hello!
recieve: I'm 192.168.50.18 from 192.168.50.11
Send the end signal



サーバー側,クライアント側どちらを先に起動してもよい.

サーバーの存在確認,ならびに,その IP アドレスの取得に使えると思う.




やじるし プログラム間通信関連メモの目次