From: "fabio de francesco" <fmdf@tiscali.it>
Subject: "broken pipe" while reading/writing stream-based sockets
Date: 10 May 2005 16:02:59 -0700
Date: 2005-05-10T16:02:59-07:00 [thread overview]
Message-ID: <1115766179.505983.40960@f14g2000cwb.googlegroups.com> (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
next reply other threads:[~2005-05-10 23:02 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-05-10 23:02 fabio de francesco [this message]
2005-05-11 10:46 ` "broken pipe" while reading/writing stream-based sockets 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
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox