comp.lang.ada
 help / color / mirror / Atom feed
* How to implement a server socket compatible to telnet?
@ 2008-08-08 11:31 snoopysalive
  2008-08-08 13:15 ` Jeffrey Creem
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: snoopysalive @ 2008-08-08 11:31 UTC (permalink / raw)


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);
        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



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2008-08-20 22:57 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox