comparison C++/SocketTcp.h @ 315:c9356cb38c86

Split sockets into SocketTcp and SocketUdp
author David Demelier <markand@malikania.fr>
date Mon, 02 Mar 2015 14:00:48 +0100
parents
children 4c0af1143fc4
comparison
equal deleted inserted replaced
314:4c3019385769 315:c9356cb38c86
1 /*
2 * SocketTcp.h -- portable C++ socket wrappers
3 *
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #ifndef _SOCKET_TCP_NG_3_H_
20 #define _SOCKET_TCP_NG_3_H_
21
22 #include "Socket.h"
23
24 /**
25 * @class SocketAbstractTcp
26 * @brief Base class for TCP sockets
27 */
28 class SocketAbstractTcp : public Socket {
29 public:
30 using Socket::Socket;
31
32 inline SocketAbstractTcp(int domain, int protocol)
33 : Socket(domain, SOCK_STREAM, protocol)
34 {
35 }
36
37 void listen(int max = 128);
38
39 inline std::string recv(unsigned count)
40 {
41 std::string result;
42
43 result.resize(count);
44 auto n = recv(const_cast<char *>(result.data()), count);
45 result.resize(n);
46
47 return result;
48 }
49
50 inline unsigned send(const std::string &data)
51 {
52 return send(data.c_str(), data.size());
53 }
54
55 virtual unsigned recv(void *data, unsigned length) = 0;
56
57 virtual unsigned send(const void *data, unsigned length) = 0;
58 };
59
60 /**
61 * @class SocketTcp
62 * @brief End-user class for TCP sockets
63 */
64 class SocketTcp final : public SocketAbstractTcp {
65 public:
66 using SocketAbstractTcp::SocketAbstractTcp;
67 using SocketAbstractTcp::recv;
68 using SocketAbstractTcp::send;
69
70 SocketTcp accept();
71
72 SocketTcp accept(SocketAddress &info);
73
74 void connect(const SocketAddress &address);
75
76 unsigned recv(void *data, unsigned length) override;
77
78 unsigned send(const void *data, unsigned length) override;
79 };
80
81 #endif // !_SOCKET_TCP_NG_3_H_