1 |
30 |
unneback |
-----------------------------------------------------------------------------
|
2 |
|
|
-- --
|
3 |
|
|
-- ADASOCKETS COMPONENTS --
|
4 |
|
|
-- --
|
5 |
|
|
-- S O C K E T S --
|
6 |
|
|
-- --
|
7 |
|
|
-- S p e c --
|
8 |
|
|
-- --
|
9 |
|
|
-- $ReleaseVersion: 0.1.3 $ --
|
10 |
|
|
-- --
|
11 |
|
|
-- Copyright (C) 1998 École Nationale Supérieure des Télécommunications --
|
12 |
|
|
-- --
|
13 |
|
|
-- AdaSockets is free software; you can redistribute it and/or modify --
|
14 |
|
|
-- it under terms of the GNU General Public License as published by --
|
15 |
|
|
-- the Free Software Foundation; either version 2, or (at your option) --
|
16 |
|
|
-- any later version. AdaSockets is distributed in the hope that it --
|
17 |
|
|
-- will be useful, but WITHOUT ANY WARRANTY; without even the implied --
|
18 |
|
|
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
|
19 |
|
|
-- See the GNU General Public License for more details. You should --
|
20 |
|
|
-- have received a copy of the GNU General Public License distributed --
|
21 |
|
|
-- with AdaSockets; see file COPYING. If not, write to the Free --
|
22 |
|
|
-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA --
|
23 |
|
|
-- 02111-1307, USA. --
|
24 |
|
|
-- --
|
25 |
|
|
-- As a special exception, if other files instantiate generics from --
|
26 |
|
|
-- this unit, or you link this unit with other files to produce an --
|
27 |
|
|
-- executable, this unit does not by itself cause the resulting --
|
28 |
|
|
-- executable to be covered by the GNU General Public License. This --
|
29 |
|
|
-- exception does not however invalidate any other reasons why the --
|
30 |
|
|
-- executable file might be covered by the GNU Public License. --
|
31 |
|
|
-- --
|
32 |
|
|
-- The main repository for this software is located at: --
|
33 |
|
|
-- http://www-inf.enst.fr/ANC/ --
|
34 |
|
|
-- --
|
35 |
|
|
-----------------------------------------------------------------------------
|
36 |
|
|
|
37 |
|
|
with Ada.Streams;
|
38 |
|
|
with Interfaces.C;
|
39 |
|
|
|
40 |
|
|
package Sockets is
|
41 |
|
|
|
42 |
|
|
type Socket_FD is tagged private;
|
43 |
|
|
-- A socket
|
44 |
|
|
|
45 |
|
|
type Socket_Domain is (AF_INET);
|
46 |
|
|
-- AF_INET: Internet sockets (yes, should be PF_INET, but they hold the
|
47 |
|
|
-- same value)
|
48 |
|
|
|
49 |
|
|
type Socket_Type is (SOCK_STREAM, SOCK_DGRAM);
|
50 |
|
|
-- SOCK_STREAM: Stream mode (TCP)
|
51 |
|
|
-- SOCK_DGRAM: Datagram mode (UDP, Multicast)
|
52 |
|
|
|
53 |
|
|
procedure Socket
|
54 |
|
|
(Sock : out Socket_FD;
|
55 |
|
|
Domain : in Socket_Domain := AF_INET;
|
56 |
|
|
Typ : in Socket_Type := SOCK_STREAM);
|
57 |
|
|
-- Create a socket of the given mode
|
58 |
|
|
|
59 |
|
|
Connection_Refused : exception;
|
60 |
|
|
|
61 |
|
|
procedure Connect
|
62 |
|
|
(Socket : in Socket_FD;
|
63 |
|
|
Host : in String;
|
64 |
|
|
Port : in Positive);
|
65 |
|
|
-- Connect a socket on a given host/port. Raise Connection_Refused if
|
66 |
|
|
-- the connection has not been accepted by the other end.
|
67 |
|
|
|
68 |
|
|
procedure Bind
|
69 |
|
|
(Socket : in Socket_FD;
|
70 |
|
|
Port : in Positive);
|
71 |
|
|
-- Bind a socket on a given port
|
72 |
|
|
|
73 |
|
|
procedure Listen
|
74 |
|
|
(Socket : in Socket_FD;
|
75 |
|
|
Queue_Size : in Positive := 5);
|
76 |
|
|
-- Create a socket's listen queue
|
77 |
|
|
|
78 |
|
|
type Socket_Level is (SOL_SOCKET, IPPROTO_IP);
|
79 |
|
|
|
80 |
|
|
type Socket_Option is (SO_REUSEADDR, IP_MULTICAST_TTL,
|
81 |
|
|
IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP,
|
82 |
|
|
IP_MULTICAST_LOOP);
|
83 |
|
|
|
84 |
|
|
procedure Setsockopt
|
85 |
|
|
(Socket : in Socket_FD'Class;
|
86 |
|
|
Level : in Socket_Level := SOL_SOCKET;
|
87 |
|
|
Optname : in Socket_Option;
|
88 |
|
|
Optval : in Integer);
|
89 |
|
|
-- Set a socket option
|
90 |
|
|
|
91 |
|
|
generic
|
92 |
|
|
Level : Socket_Level;
|
93 |
|
|
Optname : Socket_Option;
|
94 |
|
|
type Opt_Type is private;
|
95 |
|
|
procedure Customized_Setsockopt (Socket : in Socket_FD'Class;
|
96 |
|
|
Optval : in Opt_Type);
|
97 |
|
|
-- Low level control on setsockopt
|
98 |
|
|
|
99 |
|
|
procedure Accept_Socket (Socket : in Socket_FD;
|
100 |
|
|
New_Socket : out Socket_FD);
|
101 |
|
|
-- Accept a connection on a socket
|
102 |
|
|
|
103 |
|
|
Connection_Closed : exception;
|
104 |
|
|
|
105 |
|
|
procedure Send (Socket : in Socket_FD;
|
106 |
|
|
Data : in Ada.Streams.Stream_Element_Array);
|
107 |
|
|
-- Send data on a socket. Raise Connection_Closed if the socket
|
108 |
|
|
-- has been closed.
|
109 |
|
|
|
110 |
|
|
function Receive (Socket : Socket_FD;
|
111 |
|
|
Max : Ada.Streams.Stream_Element_Count := 4096)
|
112 |
|
|
return Ada.Streams.Stream_Element_Array;
|
113 |
|
|
-- Receive data from a socket. May raise Connection_Closed
|
114 |
|
|
|
115 |
|
|
procedure Receive (Socket : in Socket_FD'Class;
|
116 |
|
|
Data : out Ada.Streams.Stream_Element_Array);
|
117 |
|
|
-- Fill data from a socket. Raise Connection_Closed if the socket has
|
118 |
|
|
-- been closed before the end of the array.
|
119 |
|
|
|
120 |
|
|
type Shutdown_Type is (Receive, Send, Both);
|
121 |
|
|
|
122 |
|
|
procedure Shutdown (Socket : in Socket_FD;
|
123 |
|
|
How : in Shutdown_Type := Both);
|
124 |
|
|
-- Close a previously opened socket
|
125 |
|
|
|
126 |
|
|
---------------------------------
|
127 |
|
|
-- String-oriented subprograms --
|
128 |
|
|
---------------------------------
|
129 |
|
|
|
130 |
|
|
procedure Put (Socket : in Socket_FD'Class;
|
131 |
|
|
Str : in String);
|
132 |
|
|
-- Send a string on the socket
|
133 |
|
|
|
134 |
|
|
procedure New_Line (Socket : in Socket_FD'Class;
|
135 |
|
|
Count : in Natural := 1);
|
136 |
|
|
-- Send CR/LF sequences on the socket
|
137 |
|
|
|
138 |
|
|
procedure Put_Line (Socket : in Socket_FD'Class;
|
139 |
|
|
Str : in String);
|
140 |
|
|
-- Send a string + CR/LF on the socket
|
141 |
|
|
|
142 |
|
|
function Get (Socket : Socket_FD'Class) return String;
|
143 |
|
|
-- Get a string from the socket
|
144 |
|
|
|
145 |
|
|
function Get_Line (Socket : Socket_FD'Class) return String;
|
146 |
|
|
-- Get a full line from the socket. CR is ignored and LF is considered
|
147 |
|
|
-- as an end-of-line marker.
|
148 |
|
|
|
149 |
|
|
private
|
150 |
|
|
|
151 |
|
|
type Socket_FD is tagged record
|
152 |
|
|
FD : Interfaces.C.int;
|
153 |
|
|
end record;
|
154 |
|
|
|
155 |
|
|
end Sockets;
|