2016年11月14日月曜日

TCPやUDPにて接続を試みるプログラム

TCPやUDPを使って何かしらのデバイスに接続をしなければならない機会はよくあります。そのようなとき、どのようなプログラミング言語を使っても結果は同じです。しかし、アクセスした後に受信した文字列の処理までを含めると、ネイティブコードである必要がなければPerl言語でササッと書いてしまうのが手軽です。

例えば、GoogleにTCP(80番ポート)にてアクセスして、HTTPのGETリクエストを送り、受け取った文字列を表示するPerlプログラムは次の通りです。筆者はWindowsのActive Perl上にて動作確認を行いましたが、Linux、Mac OS、Raspberry PIあたりでも同じコードが使えるのではないかと思います。

#!/usr/bin/perl

use IO::Socket;

$sock = new IO::Socket::INET ( PeerAddr=>'www.google.co.jp',
  PeerPort=>80, Proto=>'tcp' );
die $! unless $sock;

print $sock "GET / HTTP/1.0\r\n\r\n";
print <$sock>;

close($sock);

IO::Socketを使っているので、もしライブラリが設定されていなければ、先にそちらを解決するべきでしょう。アドレス、ポート番号、プロトコル(tcpまたはudp)を任意に変更すれば、色々と使い勝手が良いかと思います。サーバに接続したあと、一方的に文字列を受信する場合は、print $sockのくだりは不要でしょう。

また、受け取った文字列に応じて何かをやりたいのであれば、print <$sock>のくだりを変更すれば良いわけですね。例えば、次のようなことができたりしますね。

while ( my $str = <$sock> )
{
  print $str;

  if ($str =~ m/^QUIT$/i)
  {
    print "Connection closed.";
    last;
  } 
}

筆者もC言語を勉強しているとき、文字列処理(とポインタ)につまづいたとき、友人からのすすめでPerl言語を少しかじってみました。C言語とは違った書き心地ですが、なかなか面白いですよ。