comp.lang.ada
 help / color / mirror / Atom feed
From: anon@anon.org (anon)
Subject: Re: How to implement a server socket compatible to telnet?
Date: Wed, 20 Aug 2008 22:57:15 GMT
Date: 2008-08-20T22:57:15+00:00	[thread overview]
Message-ID: <fj1rk.9317$Mh5.7550@bgtnsc04-news.ops.worldnet.att.net> (raw)
In-Reply-To: 0baa592d-1291-4298-90e3-88ca85a476a8@k13g2000hse.googlegroups.com

But he wants to deal with Telnet.  It states that in the title.

And actually, a complete program PingPong is coded in the file 
"GNAT.Sockets.ads " which deals with both server and client code. 

Like I say KNOW your compiler and its packages That way you might be 
able to skip spending time seaching the internet or books.


In <0baa592d-1291-4298-90e3-88ca85a476a8@k13g2000hse.googlegroups.com>, "snoopysalive@googlemail.com" <snoopysalive@googlemail.com> writes:
>Come on guys, stop arguing. In the end, I've found a solution:
>
>-----------------------------------------------------------------------
>with Ada.Text_IO,
>     Ada.Exceptions,
>	 Ada.Streams,
>	 Ada.Unchecked_Deallocation,
>     GNAT.Sockets;
>use Ada.Text_IO,
>    Ada.Exceptions,
>    Ada.Streams,
>    GNAT.Sockets;
>
>procedure IP_Server is
>
>	BUFFER_SIZE : constant Positive := 1024;
>
>	type String_Access is access all String;
>
>	procedure Free is new Ada.Unchecked_Deallocation
>		(String, String_Access);
>
>	CRLF : constant String := ASCII.CR & ASCII.LF;
>	Host : constant String := "localhost";
>	Port : Port_Type       := 7777;
>
>	Address : Sock_Addr_Type;
>	Server  : Socket_Type;
>	Client  : Socket_Type;
>	Channel : Stream_Access;
>
>	Data   : Stream_Element_Array (1..1);
>	Offset : Stream_Element_Count;
>
>	Buffer : String_Access := new String (1..BUFFER_SIZE);
>	Cnt    : Natural := 0;
>
>	Test : Float := 0.0;
>
>begin -- IP_Server
>	Initialize;
>
>	Address.Addr := Addresses (Get_Host_By_Name (Host), 1);
>	Address.Port := Port;
>
>	Create_Socket (Server);
>	Set_Socket_Option (Server, Socket_Level, (Reuse_Address, True));
>	Bind_Socket (Server, Address);
>	Listen_Socket (Server);
>	Accept_Socket (Server, Client, Address);
>	Channel := Stream (Client);
>
>	Cnt := 0;
>	loop
>		Read (Channel.all, Data (1..1), Offset);
>		if Character'Val (Data (1)) = ASCII.CR  or
>		   Character'Val (Data (1)) = ASCII.LF  or
>		   Character'Val (Data (1)) = ASCII.NUL or
>		   Offset = 0 then
>			exit;
>		else
>			Cnt := Cnt + 1;
>			Buffer.all (Cnt) := Character'Val (Data (1));
>		end if;
>	end loop;
>	-- Read values from client-stream character by character.
>	-- Reading should be stopped when Windows-linefeed or
>	-- NULL was found, because telnet seams to be sending
>	-- strings in a Windows-like format including the
>	-- terminating \0-character known from C-strings.
>
>	declare
>		Old : String_Access := Buffer;
>	begin
>		Buffer := new String'(Buffer (1..Cnt));
>		Free (Old);
>	end;
>	-- The buffer-size of Str is 1024 elements. It's necessary
>	-- to create a new String containing only relevant characters
>	-- for being able to process the message further.
>
>	declare
>		Pong : String := "pong" & CRLF;
>		O    : Stream_Element_Array (1..Pong'length);
>	begin
>		if Buffer.all = "ping" then
>			for I in Pong'range loop
>				O (Stream_Element_Offset (I)) := Character'Pos (Pong (I));
>			end loop;
>			Write (Channel.all, O);
>		end if;
>	end;
>	-- If Buffer's message equals "ping" the server will
>	-- send "pong" to the client. "pong" must be casted
>	-- from String to Stream_Element_Array first.
>
>	Close_Socket (Client);
>	Close_Socket (Server);
>
>	Finalize;
>
>exception when E : Socket_Error =>
>	Put_Line (Standard_Error, "Socket_Error => " & Exception_Message
>(E));
>
>end IP_Server;
>-----------------------------------------------------------------------------------
>
>Thanks to the thread under http://groups.google.com/group/comp.lang.ada/browse_thread/thread/c58b7bd180ea81b2
>I found out how to read character by character from the client.
>However, it's not very comfortable to cast the echo-string manually
>but it's better than not being able to communicate with telnet or
>other C-based clients.
>
>Bye,
>Matthias




      reply	other threads:[~2008-08-20 22:57 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-08 11:31 How to implement a server socket compatible to telnet? snoopysalive
2008-08-08 13:15 ` Jeffrey Creem
2008-08-08 13:35 ` Alex R. Mosteo
2008-08-08 16:24 ` anon
2008-08-09 13:19   ` snoopysalive
2008-08-10 22:15   ` Robert A Duff
2008-08-10 23:34     ` anon
2008-08-11  1:31       ` Robert A Duff
2008-08-11 18:26         ` anon
2008-08-11 18:59           ` Samuel Tardieu
2008-08-20 21:25             ` snoopysalive
2008-08-20 22:57               ` anon [this message]
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox