前へ << TCP/IP と OSI 参照モデル | 関数一覧 >> 次へ |
なぜ、perl4 でも動くように書かなかったかを説明しておきます。perl5 で Socket モジュールを使って HTTP クライアントを書くと
use Socket; $host = "www.host.com"; $path = "/~foo/index.html"; $port = getservbyname('http', 'tcp'); $iaddr = inet_aton($host); socket(SOCKET, PF_INET, SOCK_STREAM, 0); $sock_addr = sockaddr_in($port, $iaddr); connect(SOCKET, $sock_addr); select(SOCKET); $|=1; select(STDOUT); print SOCKET "GET $path HTTP/1.0\r\n\r\n"; while (<SOCKET>){ print $_; }となります。一方 perl4 ではモジュールという仕組みがないため、 上記の Bold 部分は
$iaddr = (gethostbyname($host))[4]; socket(SOCKET, 2, 1, 0); $sock_addr = pack("S n a4 x8", 2, $port, $iaddr);というふうに書かなくてはいけません (これは perl5 でも動きます)。問題は socket 関数
socket(SOCKET, PF_INET, SOCK_STREAM, 0); # perl5 の場合 socket(SOCKET, 2, 1, 0); # perl4 の場合の、第3引数、`SOCK_STREAM' と `1' という違いです。
SOCK_STREAM という文字列は /usr/include/sys/socket.h の 中で値が決まっています。FreeBSD や Linux では
#define SOCK_STREAM 1 #define SOCK_DGRAM 2となっているのですが、Solaris では
#define SOCK_STREAM 2 #define SOCK_DGRAM 1と全く逆になっているのです。つまり、perl4 で
socket(SOCKET, 2, 1, 0);とすると、FreeBSD では SOCK_STREAM (つまり TCP/IP) を意味するのですが、 Solaris だと SOCK_DGRAM (つまり UDP/IP) を意味するわけです。
HTTP は UDP でなく TCP を使いますので、
socket(SOCKET, 2, 1, 0);と書くと、FreeBSD では動くが、Solaris では動かないということになってしまいます。 ですから、Socket モジュールを使った結果、perl5 専用のスクリプトになったのです。
また、この他に
前へ << TCP/IP と OSI 参照モデル | 関数一覧 >> 次へ |
ご意見・ご指摘は Twitter: @68user までお願いします。