求 GNAT.SOCKETS TCP连接的多线程方法
with Gnat.Sockets;
use Gnat.Sockets;
with Ada.Text_Io;
procedure server is
type server_array is array(1..10)of socket_type;
Server : server_array;
type address_array is array(1..10)of sock_addr_type;
Serv_Address : address_array;
Cus_address:address_array;
type socket_array is array(1..10)of socket_type;
Serv_socket:socket_array;
Cus_socket:socket_array;
type channel_array is array(1..10)of stream_access;
Serv_channel:channel_array;
task type service is
entry start(c:integer);
end service;
task body service is
pragma warnings(off);
begin
accept start(c:integer) do
gnat.sockets.Initialize (Process_Blocking_Io => false);
Serv_address(c).addr:=inet_addr("127.0.0.1") ;
Serv_address(c).port:=port_type(799+c);
Cus_address(c).addr:=inet_addr("127.0.0.1") ;
Cus_address(c).port:=any_port;
create_socket(server(c));
Set_Socket_Option
(Server(c),
Socket_Level,
(Reuse_Address, true));
Bind_Socket (Server(c), Serv_Address(c));
Listen_Socket (Server(c));
Accept_Socket (Server(c), Serv_Socket(c), Cus_Address(c));
Serv_Channel(c) := Stream (Serv_Socket(c));
< --该处循环标记不能被正确显示
Ada.Text_Io.Put_Line(string'input(Serv_channel(c))) ;
string'output(Serv_channel(c),"Hello,have recevied your message!" & "channel" & integer'image(c) & " FEEDBACK");
delay 1.0;
goto loop_rec;
close_socket(server(c));
close_socket(Serv_socket(c));
end start;
end service;
type servers is array(1..10)of service;
thread_server:servers;
begin
for i in 1..10 loop
thread_server(i).start(i);
end loop;
end server;
以上的程序看起来是TASKING的,可实际上还是单线程的,SERVER一运行,只启动了C:=1时的实例.前面的实例
不退出的话后面的将不会启动 .请高手指点,3Q ,
