MuramatsuGroupKiller spam Library

迷惑メールを色々調べます

完全な独り言(IO::Socket::INET)

通信のお勉強と思って、基本的なサーバー - クライアント間の通信をするPerlスクリプトを組もうと思い、とりあえずDNSクライアントなんかサンプルもあるんで良いだろうと思いやってみました。

 

UDPでソケット生成する部分

my $server = IO::Socket::INET->new(
    Proto     => 'udp',
    LocalPort => $localport,
);

 

間にごちゃごちゃあって、

返事を受け取る部分

$server->recv( my $msg, 65535 ) or die "recv failed : $!\n";

 

動かないんです、はい。

エラーは、

Can't call method "recv" on an undefined value

 

さっぱりわからないので調べてみるとバッチリの答え見つけました。

http://www.perlmonks.org/?node_id=727253

 

どうやら「エラー見りゃわかんだろ、$serverがちゃんと定義できてないからrecvがコールできねぇんだよ。」と回答されているようです。

 

そもそもUDPソケット作るところがまずいんですね。

死んだら理由を述べなさい、とやっとかないと。

my $server = IO::Socket::INET->new(
    Proto     => 'udp',
    LocalPort => $localport,
) or die("Unable to create socket: $!\n");

 

死んでました。理由は、

Unable to create socket: Address already in use

 

一瞬、「は?既に使われてる?何で?」ってなったんですが、よく考えたらOSのDNSクライアントがポート53番を使ってるのは当たり前の話ですよね・・・。

 

はい、$loaclportに53をほり込んでました。

適当に5万台あたりをほり込んでやると動きました。

 

以上、完全なメモ代わりです。

 

※いや、Firewallのせいかも知れない。DNS漏れが嫌でUDP53番閉じてるから・・・

※いやいや、Firewallオフっても結果は同じだった・・・