comp.lang.ada
 help / color / mirror / Atom feed
From: "Alex R. Mosteo" <devnull@mailinator.com>
Subject: Re: How to implement a server socket compatible to telnet?
Date: Fri, 08 Aug 2008 15:35:39 +0200
Date: 2008-08-08T15:35:39+02:00	[thread overview]
Message-ID: <6g30d6Fe2ctjU1@mid.individual.net> (raw)
In-Reply-To: ca7b2304-6726-479b-89a0-67486c3dc06f@f63g2000hsf.googlegroups.com

snoopysalive@googlemail.com wrote:

> Hello!
> 
> For some reasons I had to implement a server socket in C++. Now I want
> to do the same in Ada and so I read the GNAT.Sockets-library and
> implemented a shorter version of the example given in the g-
> socket.ads.
> 
> The problem is that I want to implement the server in a kind, that
> processes written in other languages like the tool telnet or a Java-
> programme are able to communicate with it. But my server isn't able to
> print a message sent by the telnet-client, so I think that I've
> written something wrong in my code.
> 
> Here's the code:
> 
> with Ada.Text_IO,
>      Ada.Exceptions,
>      GNAT.Sockets;
> use Ada.Text_IO,
>     Ada.Exceptions,
>     GNAT.Sockets;
> 
> procedure Server is
>     Host    : String    := "localhost";
>     Port    : Port_Type := 7777;
>     Address : Sock_Addr_Type;
>     Server  : Socket_Type;
>     Client  : Socket_Type;
>     Channel : Stream_Access;
> begin -- Server
>     Initialize;
>     Address.Addr := Addresses (Get_Host_By_Name (Host), 1);
>     Address.Port := Port;
> 
>     begin
>         Create_Socket (Server);
>         Put_Line ("Server socket created");
>     exception
>         when E : Socket_Error =>
>             Put_Line (Standard_Error, "Create_Socket failed");
>     end;
>     -- Create server socket
> 
>     begin
>         Set_Socket_Option (Server, Socket_Level, (Reuse_Address,
> True));
>         Put_Line ("Socket address reused");
>     exception
>         when E : Socket_Error =>
>             Put_Line (Standard_Error, "Set_Socket_Option failed");
>     end;
>     -- Resuse socket address
> 
>     begin
>         Bind_Socket (Server, Address);
>         Put_Line ("Server socket bound");
>     exception
>         when E : Socket_Error =>
>             Put_Line (Standard_Error, "Bind_Socket failed");
>     end;
>     -- Bind server
> 
>     begin
>         Listen_Socket (Server);
>         Put ("Server is listening... ");
>     exception
>         when E : Socket_Error =>
>             Put_Line (Standard_Error, "Listen_Socket failed");
>     end;
>     -- Listening...
> 
>     begin
>         Accept_Socket (Server, Client, Address);
>         Put_Line ("Got client connection");
>         delay 0.2;
>         Channel := Stream (Client);
>         Put_Line ("Client streamed");
> 
>         declare
>             Message : String := String'input (Channel);

My bet is the problem is here above: by using String'Input, you're first trying
to read the bounds of the array. A foreign telnet client won't send
Ada-compliant arrays, but characters one by one.

You can't either use String'Read because you don't know in advance the line
length. So I'd change this to manually read one character at a time until end
of line is detected.

>         begin
>             Put_Line (Message);
>         end;
>         -- Get client message and print it to the screen
> 
>     exception
>         when E : Socket_Error =>
>             Put_Line (Standard_Error, "Accept_Socket failed");
>     end;
>     -- Client handling
> 
>     begin
>         Close_Socket (Client);
>         Put_Line ("Client closed");
>         Close_Socket (Server);
>         Put_Line ("Server closed");
>     exception
>         when E : Socket_Error =>
>             Put_Line (Standard_Error, "Close_Socket failed");
>     end;
>     -- Close client and server sockets
> 
>     Finalize;
> end Server;
> 
> 
> The server's output is:
> 
> "Server socket created
> Socket address reused
> Server socket bound
> Server is listening... Got client connection
> Client streamed
> 
> Client closed
> Server closed"
> 
> 
> The empty line should be the message sent by telnet, but like you can
> see, the message is empty.
> 
> So, can anybody explain to me, what I have done wrong?
> 
> Thank you,
> Matthias




  parent reply	other threads:[~2008-08-08 13:35 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 [this message]
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
replies disabled

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