魔法のハコはつないだだけでつながる。
よく家電とか、、プリンタとか、ネットワークケーブルをつないだだけで使えるものがある。
あれみたいなものだ。
つながるということは、
のどちらかだ。
魔法のハコクライアント(MHC)は、魔法のハコサーバ(MHS)に見つけてもらうということで考える。
実際には、【MHCがネットワークにつながったとき、マルチキャストパケットをLOCALネットワーク上に投げて、MHSにキャッチしてもらう】という方法にする。
実際には、
(1)MHSがUDPでマルチキャストパケットを受け取るようにしておく。
(2)MHCがマルチキャストを投げる。
(3)MHSがマルチキャストを受け取り、投げ元のIPに対して、TCPでMHCに情報を送る。
UDPはマルチキャストパケットの時のみ使用。そのあとは、互いのIPがわかるので、TCP/IPででれでれ情報交換するという形である。
その後、MHCはWebSocketでMHSとつながることになる。
クライアントの方はPHPで書くとこんな感じ。
試しにJSONをbase64して送っているけど、とりあえず今は使っていない。
よく家電とか、、プリンタとか、ネットワークケーブルをつないだだけで使えるものがある。
あれみたいなものだ。
つながるということは、
- こっちから見つけに行く
- 向こうから見つけてもらう
のどちらかだ。
魔法のハコクライアント(MHC)は、魔法のハコサーバ(MHS)に見つけてもらうということで考える。
実際には、【MHCがネットワークにつながったとき、マルチキャストパケットをLOCALネットワーク上に投げて、MHSにキャッチしてもらう】という方法にする。
実際には、
(1)MHSがUDPでマルチキャストパケットを受け取るようにしておく。
(2)MHCがマルチキャストを投げる。
(3)MHSがマルチキャストを受け取り、投げ元のIPに対して、TCPでMHCに情報を送る。
UDPはマルチキャストパケットの時のみ使用。そのあとは、互いのIPがわかるので、TCP/IPででれでれ情報交換するという形である。
その後、MHCはWebSocketでMHSとつながることになる。
クライアントの方はPHPで書くとこんな感じ。
試しにJSONをbase64して送っているけど、とりあえず今は使っていない。
$udp_port = 41900;
$tcp_port = 41901;
$sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
socket_set_option( $sock,IPPROTO_IP,MCAST_JOIN_GROUP, array( 'group'=>'239.255.255.250', 'interface'=>0 ));
$msgAR = array();
$IP = getHostByName(getHostName());
$msgAR["system"]["ip"] = $IP;
$msgAR["system"]["type"] = "checker";
$msg = json_encode($msgAR);
$a64= base64_encode( $msg );
$msg = "FINRED\n{$a64}\n\n";
$send_ret = socket_sendto( $sock, $msg, strlen( $msg ), 0, '239.255.255.250', $udp_port);
socket_close( $sock );
// 一旦おくりつけてこのsocketは終了
// 今度はTCPで受け取る
$sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
// socket_bind($sock,$IP,41901);
// socket_bind($sock,'127.0.0.1',$tcp_port);
socket_bind($sock,'0.0.0.0',$tcp_port);
socket_listen($sock, 10);
$remote = socket_accept($sock);
$data = socket_read($remote, 4096);
echo "data:{$data}";
サーバの方はこんな感じで。
$port = 41900;
$IP = getHostByName(getHostName());
//UDPのソケット作成
$sock = socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);
socket_bind($sock,'0.0.0.0',$port); // 成功
socket_set_option( $sock
,IPPROTO_IP
,MCAST_JOIN_GROUP
, array( 'group'=>'239.255.255.250', 'interface'=>0 )
);
$from = '';
while(true){
//UDPのソケットを受信
$buf="";
socket_recvfrom($sock,$buf,4096,0,$from,$port);
$idx = strpos($buf,"FINRED");
if($idx === 0) echo "\n------({$idx})------------------------------------------\nbuf:{$buf}\n";
else echo ".";
$v = substr($buf,6);
$v = base64_decode($v);
$j = json_decode($v,true);
$ip = $j["system"]["ip"];
$type = $j["system"]["type"];
echo "\nip:{$ip} type:{$type}\n";
echo "from:{$from} port:{$port}\n";
usleep(1000000);
$msg = "FINERD RETURN\nIP:{$IP}";
// TCPで送りつける
$socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_connect($socket, $from,41901);
socket_write($socket, $msg, strlen($msg));
socket_close($socket);
}
//close socket
socket_close($sock);
実行してみたところ(o^^o)
コメント
コメントを投稿