policy-file-requestの対処法
最新のFlash Playerでは、サーバーと通信するとき、
そこでその文字列を返す方法を探って見たところ、色々方法があったのでメモ。
1.rubyの場合
ついでにrubyバージョンの方法もあったのでメモ。
require ‘socket’
require ‘rexml/document’
if ARGV.empty?
puts “Usage: #{File.basename($0)}”
exit 1
end
policy = File.read(ARGV[0]) + “\0”
REQUEST_LIMIT = 32
def log(addr, msg)
puts “#{addr} #{msg}”
end
srv = TCPServer.open(843)
while true
Thread.start(srv.accept) {|s|
port, addr = Socket.unpack_sockaddr_in( s.getpeername )
begin
log addr, “connection accepted”
buf = “”
begin
buf << s.sysread(REQUEST_LIMIT) raise "request too big" if buf.length > REQUEST_LIMIT
end until buf.include?(“\0”)
log addr, “received request #{buf.inspect}”
req = REXML::Document.new(buf)
unless req.root.name == “policy-file-request”
raise “invalid request”
end
log addr, “sending policy file”
s.write policy
rescue
log addr, “invalid request: #{$!.inspect}”
ensure
s.close
end
}
end
でも実際につかってみたら、
C:/ruby/socket.rb:16:in
require’
': uninitialized constant TCPServer (Na
meError)
from c:/ruby/socket.rb:1:in
from c:/ruby/socket.rb:1:in `‘
っていわれて使えなかったので使うのあきらめた。
PHPの場合
<?php
if( posix_getuid() != 0 ) // これはWindows環境では使えない関数なので、Windowsの場合はここを削除
die( “You must run this script as root.\n” );
$sock = @socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
if( !$sock )
die( “Unable to create socket.\n” );
$succ = @socket_bind( $sock, “0.0.0.0”, 843 );
if( !$succ )
die( “Unable to bind to port 843.\n” );
$succ = @socket_listen( $sock );
if( !$succ )
die( “Unable to start listening.\n” );
while( true ) {
$r = $w = $e = array( $sock );
if( @socket_select( $r, $w, $e, null ) !== false ) {
$conn = @socket_accept( $sock );
if( $conn !== false ) {
socket_write( $conn, $policy_file );
socket_close( $conn );
} else {
echo “socket_accept() failed?\n”;
break;
}
} else {
echo “socket_select() failed?\n”;
break;
}
}
socket_close( $sock );
c:\php\php c:\www/socket.phpとコマンドプロンプトで実行しておくことでソケットをまちうけている状態にして、動作することができた。
Javaの場合
import java.net.Socket;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.IOException;
public class socket {
public static final int ECHO_PORT = 843;
public static void main(String args[]) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(ECHO_PORT);
System.out.println(“Serverが起動しました(port=” + serverSocket.getLocalPort() + “)”);
while (true) {
Socket socket = serverSocket.accept();
new EchoThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
}
}
}
}
class EchoThread extends Thread {
private Socket socket;
public EchoThread(Socket socket) {
this.socket = socket;
System.out.println(“接続されました ” + socket.getRemoteSocketAddress());
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// out.println(““);
out.println(““);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {}
System.out.println(“切断されました ” + socket.getRemoteSocketAddress());
}
}
}
Javaだったら大体環境も容易されてるしで、実行しやすいかな?
Adobe Flash CS4 詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)
Adobe Flash CS4 Professional (V10.0) 日本語版 Windows版