-- ***************************************************************************** -- $Id: unix_server_1.m4,v 1.2 1993/04/08 15:12:35 courtel Exp $ -- -- Kind: Test procedure -- Abstract: Unix socket interface -- Review: -- Portable: YES -- -- Copyright 1992 Centre d'Etudes de la Navigation Aerienne (CENA) -- ***************************************************************************** with ERROR, DEBUG, TIME, DIR, INET, NETWORK, FILE; with UNIX_SOCKET; use UNIX_SOCKET; procedure UNIX_SERVER_1 is -- ************************************************************************** -- This server has the following characteristics: -- - Unix socket -- - Use READ/WRITE procedures -- - No acquit -- - Blocking socket -- - Do not force buffer fill -- - Change default socket options -- ************************************************************************** package NET renames NETWORK; use TIME; procedure BUF_READ is new FILE.READ (BUFFER, FALSE); SERVER: FILE.SOCKADDR (FAMILY => NET.AF_UNIX); MSGSERVER: FILE.SOCKADDR (FAMILY => NET.AF_UNIX); SOCK: FILE.DESCRIPTOR; CONNSOCK: FILE.DESCRIPTOR; SOCK_BUF_SIZE: POSITIVE; task type READER_TASK is entry START (CONNSOCK: FILE.DESCRIPTOR); end READER_TASK; type READER_TASK_PTR is access READER_TASK; for READER_TASK'storage_size use 2 * BUFSIZE + 10_240; READER: READER_TASK_PTR; task body READER_TASK is FD: FILE.DESCRIPTOR; -- Where to read BUF, TMP: BUFFER; -- What I'm gonna read BYTES_READ: NATURAL; RVAL: NATURAL := 0; TOTAL: NATURAL := 0; -- How many bytes I read T1, T2: TIME.TIME_T; -- To know how long I am begin accept START (CONNSOCK: FILE.DESCRIPTOR) do FD := CONNSOCK; end; T1 := TIME.TIME; loop begin BYTES_READ := 0; loop BUF_READ (FD, TMP, BUFSIZE - BYTES_READ, RVAL); BUF (BYTES_READ + 1 .. BYTES_READ + RVAL) := TMP (1 .. RVAL); BYTES_READ := BYTES_READ + RVAL; DEBUG.WARNING ("Read" & NATURAL'image (RVAL) & " bytes"); exit when BYTES_READ = BUFSIZE; end loop; TOTAL := TOTAL + BYTES_READ; exception when FILE.END_ERROR => exit; when others => DEBUG.ERROR ("Unexpected error in task READER_TASK"); end; end loop; T2 := TIME.TIME; DEBUG.PRINT (NATURAL'image (TOTAL) & " bytes received, time =" & INTEGER'image (T2 - T1) & " sec"); FILE.CLOSE (FD); end READER_TASK; begin SOCK := FILE.SOCKET (DOMAIN, FILE.STREAM); if DIR.C_ACCESS (SOCKET_NAME, DIR.F_OK) then DIR.UNLINK (SOCKET_NAME); end if; SERVER.PATH (SOCKET_NAME'range) := SOCKET_NAME; SERVER.PATHLEN := FILE.PATHLEN_TYPE (SOCKET_NAME'last); FILE.BIND (SOCK, SERVER); FILE.SOCKOPT.SET_RCVBUF (SOCK, 8192); FILE.SOCKOPT.SET_REUSEADDR (SOCK, TRUE); SOCK_BUF_SIZE := FILE.SOCKOPT.GET_RCVBUF (SOCK); DEBUG.PRINT ("Reuseaddr = " & BOOLEAN'image (FILE.SOCKOPT.GET_REUSEADDR (SOCK))); DEBUG.PRINT ("Read buffer size =" & POSITIVE'image (SOCK_BUF_SIZE)); FILE.LISTEN (SOCK, 5); loop FILE.C_ACCEPT (SOCK, MSGSERVER, CONNSOCK); DEBUG.PRINT ("Starting task for descriptor" & FILE.DESCRIPTOR'image (CONNSOCK)); READER := new READER_TASK; READER.START (CONNSOCK); end loop; end UNIX_SERVER_1;