First commit of release 0.1
[sockstream.git] / include / socket.h
1 /**************************************************************************
2 **  (c) Copyright 2012, Andromeda Technology & Automation
3 ***************************************************************************
4 ** MODULE INFORMATION *
5 ***********************
6 **      FILE NAME      : socket.h
7 **      SYSTEM NAME    : Network and socket classes
8 **      VERSION NUMBER : 0.1
9 **
10 **  DESCRIPTION      :  SocketAddress, Socket and derived classes definition
11 **
12 **  EXPORTED OBJECTS : class SocketAddress, class UNIXSocketAddress,
13 **                     class IPSocketAddress,
14 **                     class Socket, class StreamSocket, class DatagramSocket
15 **  LOCAL    OBJECTS : 
16 **  MODULES  USED    :
17 ***************************************************************************
18 **  ADMINISTRATIVE INFORMATION *
19 ********************************
20 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
21 **      CREATION DATE   : Mar 02, 2012
22 **      LAST UPDATE     : Mar 08, 2012
23 **      MODIFICATIONS   : 
24 **************************************************************************/
25
26 #include <sys/socket.h>   //  For types and constants (like SOCK_STREAM)
27 #include "inetaddress.h"
28 #include "port.h"
29
30 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31 **  NAME           : SocketAddress - Abstract baseclass that defines a socket address.
32 **  MEMBERS        : 
33 **  OPERATORS      : None
34 **  METHODS        : address_family() : Address family of the address: AF_UNIX, AF_INET or AF_INET6
35 **                   get_sockaddr()   : A sockaddr pointer usefull for bind(2) and connect(2)
36 **                   get_socklen()    : Length of the sockaddr structure.
37 **
38 **  DESCRIPTION    : 
39 **
40 **
41 **  RELATIONS      : 
42 **  SEE ALSO       : 
43 **  LAST MODIFIED  : Mar 08, 2012
44 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
45 */
46
47 class SocketAddress
48 {
49
50 public:
51
52    virtual int address_family() = 0;
53
54    virtual struct sockaddr * get_sockaddr() = 0;
55
56    virtual socklen_t get_socklen() = 0;
57 };
58
59 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
60 **  NAME           : IPSocketAddress - A socket address for IP sockets
61 **  MEMBERS        : 
62 **  OPERATORS      : None
63 **  METHODS        : address_family() : Address family of the address: AF_UNIX, AF_INET or AF_INET6
64 **                   get_sockaddr()   : A sockaddr pointer usefull for bind(2) and connect(2)
65 **                   get_socklen()    : Length of the sockaddr structure.
66 **
67 **  DESCRIPTION    : 
68 **
69 **
70 **  RELATIONS      : 
71 **  SEE ALSO       : 
72 **  LAST MODIFIED  : Mar 08, 2012
73 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
74 */
75
76 class IPSocketAddress : public SocketAddress
77 {
78    InternetAddress  IPaddress;
79    Port             prt;
80
81    struct sockaddr_in   in;
82    struct sockaddr_in6  in6;
83
84 public:
85
86    IPSocketAddress(InternetAddress ip, Port p)
87    {
88       IPaddress = ip;
89       prt       = p;
90    }
91
92    int address_family()
93    {
94       return IPaddress.address_family();
95    }
96    struct sockaddr * get_sockaddr();
97    socklen_t get_socklen();
98 };
99
100 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
101 **  NAME           : Socket - Abstract baseclass that defines a socket.
102 **  MEMBERS        : 
103 **  OPERATORS      : None
104 **  METHODS        : Listen() : Create a server socket
105 **                   Close()  : Close the UNIX socket.
106 **
107 **  DESCRIPTION    : 
108 **
109 **
110 **  RELATIONS      : 
111 **  SEE ALSO       : 
112 **  LAST MODIFIED  : Mar 08, 2012
113 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
114 */
115
116 class Socket
117 {
118 protected:
119
120    int  fd;   //  File descriptor of the UNIX socket.
121
122 public:
123
124    Socket()
125    {
126       fd = -1;
127    }
128
129    ~Socket()
130    {
131      // if (fd != -1)
132      // {
133      //    close(fd);
134      //    fd  = -1;
135      // }
136    }
137
138    void Close()
139    {
140       close(fd);
141       fd = -1;
142    }
143 };
144
145 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
146 **  NAME           : StreamSocket - A stream (TCP) socket.
147 **  MEMBERS        : 
148 **  OPERATORS      : None
149 **  METHODS        : Listen() : Create a server socket
150 **                   Close()  : Close the UNIX socket.
151 **
152 **  DESCRIPTION    : 
153 **
154 **
155 **  RELATIONS      : 
156 **  SEE ALSO       : 
157 **  LAST MODIFIED  : Mar 08, 2012
158 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
159 */
160
161 class StreamSocket : public Socket
162 {
163 public:
164
165    int Connect(SocketAddress &sa); 
166    int Listen(SocketAddress  &sa); 
167    StreamSocket Accept();
168
169    ssize_t Read(void *buf, size_t count)
170    {
171       return read(fd, buf, count);
172    }
173
174    ssize_t Write(const void *buf, size_t count)
175    {
176       return write(fd, buf, count);
177    }
178 };