blob: e8d360fe04867c2db435b69543273ff02cda23c4 [file] [log] [blame]
Kevin Rocardef8d7272014-04-23 20:34:14 +02001/*
David Wagnerb76c9d62014-02-05 18:30:24 +01002 * Copyright (c) 2011-2014, Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation and/or
13 * other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors
16 * may be used to endorse or promote products derived from this software without
17 * specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Patrick Benavoli68a91282011-08-31 11:23:23 +020029 */
30#pragma once
31
32#include <string>
33#include <stdint.h>
34
35using namespace std;
36
37struct sockaddr_in;
38struct in_addr;
39
Kevin Rocardef8d7272014-04-23 20:34:14 +020040/** Readable and writable socket.
41 *
42 * The class does not encapsulate completely it's internal file descriptor as
43 * it can be retrieve by the getFd method.
44 *
45 * This "feature" means that it's state consistency can not
46 * be enforced by the class but rather by clients.
47 */
Patrick Benavoli68a91282011-08-31 11:23:23 +020048class CSocket
49{
50public:
51 CSocket();
52 CSocket(int iSockId);
53 virtual ~CSocket();
54
55 // Non blocking state
56 void setNonBlocking(bool bNonBlocking);
57
58 // Communication timeout
59 void setTimeout(uint32_t uiMilliseconds);
60
Kevin Rocardef8d7272014-04-23 20:34:14 +020061 /* Read data
62 *
63 * On failure errno will be set appropriately (see send).
64 * If the client disconnects, false will be returned and
65 * - hasPeerDisconnected will return true
66 * - errno is set to ECONNRESET.
67 * @param[in] pvData - on success: will contain the sent data
68 * - on failure: undefined
69 * @param[in] uiSize size of the data to receive.
70 *
71 * @return true if all data could be read, false otherwise.
72 */
Patrick Benavoli68a91282011-08-31 11:23:23 +020073 bool read(void* pvData, uint32_t uiSize);
Kevin Rocardef8d7272014-04-23 20:34:14 +020074
75 /* Write data
76 *
77 * On failure errno will be set (see recv)
78 * @param[in] pvData data to send.
79 * @param[in] uiSize is the size of the data to send.
80 *
81 * @return true if all data could be read, false otherwise.
82 */
Patrick Benavoli68a91282011-08-31 11:23:23 +020083 bool write(const void* pvData, uint32_t uiSize);
84
Kevin Rocardef8d7272014-04-23 20:34:14 +020085 /** @return the managed file descriptor.
86 *
87 * The client can then bind/connect/accept/listen/... the socket.
88 */
Patrick Benavoli68a91282011-08-31 11:23:23 +020089 int getFd() const;
Kevin Rocardef8d7272014-04-23 20:34:14 +020090
91 /** @return true if the peer has disconnected.
92 *
93 * The internal fd is returned by getFd and clients can use it for
94 * bind/connect/read/write/... as a result it's state can not be tracked.
95 *
96 * Thus hasPeerDisconnected returns true only if the disconnection
97 * was notified during a call to CSocket::write or CSocket::read.
98 */
99 bool hasPeerDisconnected();
100
Patrick Benavoli68a91282011-08-31 11:23:23 +0200101protected:
102 // Socket address init
103 void initSockAddrIn(struct sockaddr_in* pSockAddrIn, uint32_t uiInAddr, uint16_t uiPort) const;
104private:
105 int _iSockFd;
Kevin Rocardef8d7272014-04-23 20:34:14 +0200106 /** If the peer disconnected.
107 *
108 * This is not the state of _iSockFd (connected/disconnected)
109 *
110 * See hasPeerDisconnected for more details.
111 */
112 bool _disconnected;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200113};