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
10 ** DESCRIPTION : SocketAddress, Socket and derived classes implementation
12 ** EXPORTED OBJECTS : class SocketAddress, class Socket
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
22 **************************************************************************/
27 /*=========================================================================
28 ** NAME : IPSocketAddress::get_sockaddr
31 ** RETURN VALUE : Pointer to the low-level socketaddress structure
39 ** LAST MODIFIED : Mar 08, 2012
40 **=========================================================================
43 struct sockaddr * IPSocketAddress::get_sockaddr()
45 if (IPaddress.address_family() == AF_INET)
47 // Create an IPv4 socket address
49 in.sin_family = AF_INET;
50 in.sin_port = prt.get_port();
51 in.sin_addr = IPaddress.get_in_addr();
53 return (sockaddr *)∈
55 else if (IPaddress.address_family() == AF_INET6)
57 // Create an IPv6 socket address
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;
65 return (sockaddr *)&in6;
73 socklen_t IPSocketAddress::get_socklen()
75 if (IPaddress.address_family() == AF_INET)
77 return sizeof(struct sockaddr_in);
79 else if (IPaddress.address_family() == AF_INET6)
81 return sizeof(struct sockaddr_in6);
89 int StreamSocket::Connect(SocketAddress &sa)
95 fd = socket(sa.address_family(), SOCK_STREAM, 0);
97 res = connect(fd, sa.get_sockaddr(), sa.get_socklen());
101 int StreamSocket::Listen(SocketAddress &sa)
107 fd = socket(sa.address_family(), SOCK_STREAM, 0);
109 res = bind(fd, sa.get_sockaddr(), sa.get_socklen());
112 res = listen(fd, 100);
117 StreamSocket StreamSocket::Accept()
119 struct sockaddr_in6 peer_address;
124 peer.fd = accept(fd, (sockaddr *)&peer_address, &peer_len);