今日のAda
昨日作ったクライアントを少し改造して、IRCサーバに接続してみた。
with Ada.Text_IO; use Ada.Text_IO;
with GNAT.Sockets; use GNAT.Sockets;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Command_Line;
with Ada.Streams;
use type Ada.Streams.Stream_Element_Count;
procedure Sock is
task Connection_Send is
entry Start (Connection : in out Stream_Access);
entry Stop;
end Connection_Send;
task body Connection_Send is
Connection_Stream : Stream_Access;
Item : String(1 .. 512);
Last : Natural;
begin
accept Start (Connection : in out Stream_Access) do
Connection_Stream := Connection;
end Start;
loop
Ada.Text_IO.Get_Line (Item => Item, Last => Last);
String'Write(Connection_Stream, Item(1 .. Last) & ASCII.LF);
end loop;
end Connection_Send;
task Connection_Recieve is
entry Start (Connection : in out Stream_Access);
entry Stop;
end Connection_Recieve;
task body Connection_Recieve is
Connection_Stream : Stream_Access;
Item : Character;
begin
accept Start (Connection : in out Stream_Access) do
Connection_Stream := Connection;
end Start;
loop
Character'Read (Connection_Stream, Item);
Ada.Text_IO.Put (Item);
end loop;
end Connection_Recieve;
Server : Socket_Type;
Server_Address : Sock_Addr_Type;
Connection : Stream_Access;
begin
Initialize;
Server_Address.Addr := Addresses(Get_Host_By_Name(Ada.Command_Line.Argument(1)), 1);
Server_Address.Port := 6667;
Create_Socket (Server);
Ada.Text_IO.Put_Line ("Connecting...");
Connect_Socket (Server, Server_Address);
Connection := Stream (Server);
Ada.Text_IO.Put_Line ("Connection Established.");
Ada.Text_IO.Put_Line ("-----------------------");
Connection_Recieve.Start(Connection);
Connection_Send.Start(Connection);
end Sock;
ホスト名からIPを解決できるようにしたので、./sock irc.tokyo.wide.ad.jp
で繋がる。StringからIntegerへの変換方法が分からなかったので(型関係がいまいち理解できてない)、とりあえずポートは6667番固定にした。
接続できたらNICK hoge
、USER hoge 0 hoge :hoge
などと打ったあと、JOIN #hoge
すれば「#hoge」というチャンネルに入ることが出来るはず。詳細はRFC2812を参照のこと。
メッセージの受信はいただいたコメントに従ってCharacter'Read()
を使用する方法に変えてみた。が、正直Attributeがよく分かっていない。Javaのstatic
なメソッドに近い感じなのだろうか。