First commit of release 0.1
[sockstream.git] / src / socket.cpp
1 /**************************************************************************
2 **  (c) Copyright 2012, Andromeda Technology & Automation
3 ***************************************************************************
4 ** MODULE INFORMATION *
5 ***********************
6 **      FILE NAME      : socket.cpp
7 **      SYSTEM NAME    : Network and socket classes
8 **      VERSION NUMBER : 0.1
9 **
10 **  DESCRIPTION      :  SocketAddress, Socket and derived classes implementation
11 **
12 **  EXPORTED OBJECTS : class SocketAddress, class Socket
13 **  LOCAL    OBJECTS : 
14 **  MODULES  USED    :
15 ***************************************************************************
16 **  ADMINISTRATIVE INFORMATION *
17 ********************************
18 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
19 **      CREATION DATE   : Mar 02, 2012
20 **      LAST UPDATE     : Mar 08, 2012
21 **      MODIFICATIONS   : 
22 **************************************************************************/
23
24 #include "socket.h"
25
26
27 /*=========================================================================
28 **  NAME           : IPSocketAddress::get_sockaddr
29 **  SYNOPSIS       :
30 **  PARAMETERS     :
31 **  RETURN VALUE   : Pointer to the low-level socketaddress structure
32 **
33 **  DESCRIPTION    : 
34 **
35 **  VARS USED      :
36 **  VARS CHANGED   :
37 **  FUNCTIONS USED :
38 **  SEE ALSO       :
39 **  LAST MODIFIED  : Mar 08, 2012
40 **=========================================================================
41 */
42
43 struct sockaddr * IPSocketAddress::get_sockaddr()
44 {
45    if (IPaddress.address_family() == AF_INET)
46    {
47       //  Create an IPv4 socket address
48
49       in.sin_family = AF_INET;
50       in.sin_port   = prt.get_port();
51       in.sin_addr   = IPaddress.get_in_addr();
52
53       return (sockaddr *)∈
54    }
55    else if (IPaddress.address_family() == AF_INET6)
56    {
57       //  Create an IPv6 socket address
58
59       in6.sin6_family = AF_INET6;
60       in6.sin6_port   = prt.get_port();
61       in6.sin6_addr   = IPaddress.get_in6_addr();
62       in6.sin6_flowinfo = 0;
63       in6.sin6_scope_id = 0;
64
65       return (sockaddr *)&in6;
66    }
67    else
68    {
69       return 0;
70    }
71 }
72
73 socklen_t IPSocketAddress::get_socklen()
74 {
75    if (IPaddress.address_family() == AF_INET)
76    {
77       return sizeof(struct sockaddr_in);
78    }
79    else if (IPaddress.address_family() == AF_INET6)
80    {
81       return sizeof(struct sockaddr_in6);
82    }
83    else
84    {
85       return 0;
86    }
87 }
88
89 int StreamSocket::Connect(SocketAddress &sa) 
90 {
91    int res;
92
93    if (fd == -1)
94    {
95       fd = socket(sa.address_family(), SOCK_STREAM, 0);
96    }
97    res = connect(fd, sa.get_sockaddr(), sa.get_socklen());
98    return res;
99 }
100
101 int StreamSocket::Listen(SocketAddress &sa) 
102 {
103    int res;
104
105    if (fd == -1)
106    {
107       fd = socket(sa.address_family(), SOCK_STREAM, 0);
108    }
109    res = bind(fd, sa.get_sockaddr(), sa.get_socklen());
110    if (res == 0)
111    {
112       res = listen(fd, 100);
113    }
114    return res;
115 }
116
117 StreamSocket StreamSocket::Accept()
118 {
119    struct sockaddr_in6  peer_address;
120    socklen_t            peer_len;
121
122    StreamSocket         peer;
123
124    peer.fd = accept(fd, (sockaddr *)&peer_address, &peer_len);
125
126    return peer;
127 }
128