Socketプログラミングは初めて。添削希望。
socket形式
-
(そのPCが知っている)IPMessengerを利用しているクライアント一覧を問い合わせ
1:100:username:pcname:18:0
-
メッセージ文
hello_world
を送信1:100:username:pcname:32:hello_world
処理の流れ
- udp://target_ip, port 2425のsocketを生成
- target_ipのIpMessengerに、username,pcnameを名乗り、target_ipさんが知っているクライアント一覧が欲しいと言う。
- target_ipさんからクライアント一覧をもらうが、死活監視がしたいだけなのでとりあえず1バイトだけもらっとく。
- 取得結果のok,ngを送信
IpMessengerクラス
ipmessenger.php
<?php
class IpMessenger {
const IPMSG_GETLIST = '18';
const IPMSG_SENDMESSAGE = '32';
const STREAM_TIMEOUT = 3; //second
private $target_ip;
public function set_target_ip($ip) {
$this->target_ip = $ip;
}
private function connect() {
$fp = fsockopen('udp://'.$this->target_ip, 2425);
stream_set_timeout($fp, self::STREAM_TIMEOUT);
return $fp;
}
public function connect_check() {
$fp = self::connect();
fwrite($fp, "1:100:username:pcname:".self::IPMSG_GETLIST.":0");
$data_length = 1;
if(!fread($fp, $data_length)) {
return false;
}
return true;
}
public function send_message($message_utf8) {
$fp = self::connect();
$message_sjis = mb_convert_encoding($message_utf8,"sjis","utf-8");
fwrite($fp, "1:100:username:groupname:".self::IPMSG_SENDMESSAGE.":".$message_sjis);
}
}
使い方
- 192.168.100.45 : phpを実行する端末
- 192.168.100.68 : チェックしたいIPMessengerの端末
- 192.168.100.67 : 結果をIPMessengerで受け取る端末
main.php
<?php
require_once('ipmessenger.php');
$ipmsg = new IpMessenger();
$ipmsg->set_target_ip('192.168.100.68');
if($ipmsg->connect_check()) {
$ipmsg->set_target_ip('192.168.100.67');
$ipmsg->send_message("日本語でもOK");
} else {
$ipmsg->set_target_ip('192.168.100.67');
$ipmsg->send_message("ng");
}
実行
実行
php main.php
- 192.168.100.68 の IPMessengerの応答があるとき、192.168.100.67 へokを送る
- 192.168.100.68 の IPMessengerの応答がないとき、192.168.100.67 へokを送る