comp.lang.ada
 help / color / mirror / Atom feed
* "broken pipe" while reading/writing stream-based sockets
@ 2005-05-10 23:02 fabio de francesco
  2005-05-11 10:46 ` Adrien Plisson
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: fabio de francesco @ 2005-05-10 23:02 UTC (permalink / raw)


Ciao,

I'm still having problems while doing sockets read/write. I have a
server that often crashes with error "Broken Pipe". The server works
always with the same clients and many times it doesn't crash until
something happens that I don't understand.

This is the server code:

-- file tcp_server.adb

with GNAT.Sockets;             use GNAT.Sockets;
with Ada.Text_IO;                use Ada.Text_IO;

procedure TCP_Server is

    Socket : Socket_Type;
    Client : Socket_Type;
    Sock_Addr : Sock_Addr_Type;
    Cli_Addr : Sock_Addr_Type;
    L : constant Positive := 5;
    Channel : Stream_Access;
    S : String( 1 .. 80 );

begin

    Initialize;
    Create_Socket( Socket );
    Set_Socket_Option( Socket, Socket_Level, ( Reuse_Address, True ) );
    Sock_Addr.Addr := Inet_Addr( "127.0.0.1" );
    Sock_Addr.Port := 9876;
    Bind_Socket( Socket, Sock_Addr );
    Listen_Socket( Socket, L );
    Put_Line( "Server in attesa di connessioni..." );

    loop
        Accept_Socket( Socket, Client, Cli_Addr );
        Channel := Stream( Client );
        String'Read( Channel, S );
        String'Write ( Channel, ( "Ricevuto " & S ) );
        Put_Line( "Client ha inviato codice """ & S & """" );
        Free( Channel );
        Close_Socket( Client );
        if S( 1 .. 4 ) = "kill" then
            Put_Line( "Sono stato ucciso" );
            exit;
        end if;
    end loop;

    Close_Socket( Socket );
    Finalize;

end TCP_Server;


And the following is client code:

-- file tcp_client.adb

with GNAT.Sockets;             use GNAT.Sockets;
with Ada.Text_IO;                 use Ada.Text_IO;
with Ada.Strings;                  use Ada.Strings;
with Ada.Strings.Fixed;         use Ada.Strings.Fixed;
with Ada.Command_Line;      use Ada.Command_Line;

procedure TCP_Client is

    Socket : Socket_Type;
    Address : Sock_Addr_Type;
    Channel : Stream_Access;
    S : String( 1 .. 80 );

begin

    if Argument_Count < 1 then
        return;
    end if;

    Initialize;
    Create_Socket( Socket );
    Address.Addr := Addresses( Get_Host_By_Name( "localhost" ), 1 );
    Address.Port := 9876;
    Connect_Socket( Socket, Address );
    Channel := Stream( Socket );

    Move( Argument( 1 ), S );
    if S( 1 .. 4 ) = "kill" then
        Put_Line( "Sto ordinando a Server di fermarsi!" );
    else
        Put_Line( "Sto inviando """ & Trim( S, Both ) & """" );
    end if;

    String'Write( Channel, S );
    String'Read( Channel, S );
    Put_Line( "Server ha risposto """ & Trim( S, Both ) & """" );

    Free( Channel );
    Close_Socket( Socket );
    Finalize;

end TCP_Client;


I usually test the server this way:

$ ./tcp_client abc & ./tcp_client def & ./tcp_client xyz & ./tcp_client
kill

1) Why does this server sometimes crash with "Broken Pipe"?
2) It seems that using Input/Output instead of Read/Write never causes
"Broken Pipe". Why?

Thanks to all of you who will reply,

fabio de francesco




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

end of thread, other threads:[~2005-05-20 20:02 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-05-10 23:02 "broken pipe" while reading/writing stream-based sockets fabio de francesco
2005-05-11 10:46 ` Adrien Plisson
2005-05-11 15:01   ` fabio de francesco
2005-05-11 21:18 ` Simon Wright
2005-05-11 23:30   ` fabio de francesco
2005-05-13 20:18   ` fabio de francesco
2005-05-13 20:25     ` fabio de francesco
2005-05-14 20:39     ` Jeffrey Carter
2005-05-14 21:27 ` Florian Weimer
2005-05-20 15:01   ` fabio de francesco
2005-05-20 17:52     ` tmoran
2005-05-20 20:02     ` Simon Wright

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