annotate C++/Socket.cpp @ 288:b500a445be97

Zip: file needed for tests
author David Demelier <markand@malikania.fr>
date Wed, 12 Nov 2014 12:46:30 +0100
parents ea55a3886da0
children 9b3270513f40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Socket.cpp -- portable C++ socket wrappers
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013, David Demelier <markand@malikania.fr>
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
176
ba62ab219fc4 add cstring for strerror
David Demelier <markand@malikania.fr>
parents: 175
diff changeset
19 #include <cstring>
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include "Socket.h"
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include "SocketAddress.h"
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 /* --------------------------------------------------------
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
25 * Socket exceptions
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 * -------------------------------------------------------- */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
28 namespace error {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
29
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
30 Timeout::Timeout(std::string func)
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
31 : m_error(func + ": Timeout exception")
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
32 {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
33 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
34
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
35 const char *Timeout::what() const noexcept
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
37 return m_error.c_str();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
38 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
39
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
40 InProgress::InProgress(std::string func)
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
41 : m_error(func + ": Operation in progress")
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
42 {
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
45 const char *InProgress::what() const noexcept
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
47 return m_error.c_str();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
48 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
49
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
50 WouldBlock::WouldBlock(std::string func)
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
51 : m_error(func + ": Operation would block")
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
52 {
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
55 const char *WouldBlock::what() const noexcept
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
56 {
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
57 return m_error.c_str();
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
58 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
59
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
60 Failure::Failure(std::string func, std::string message)
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
61 : m_error(func + ": " + message)
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
62 {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
63 }
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
64
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
65 const char *Failure::what() const noexcept
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
66 {
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
67 return m_error.c_str();
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
68 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
69
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
70 } // !error
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
71
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 /* --------------------------------------------------------
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * Socket implementation
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * -------------------------------------------------------- */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 void Socket::init()
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 #if defined(_WIN32)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 WSADATA wsa;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 WSAStartup(MAKEWORD(2, 2), &wsa);
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 #endif
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
84 void Socket::finish()
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
85 {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
86 #if defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
87 WSACleanup();
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
88 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
89 }
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
90
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 /* --------------------------------------------------------
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 * System dependent code
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 * -------------------------------------------------------- */
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 #if defined(_WIN32)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
97 std::string Socket::syserror(int errn)
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 LPSTR str = nullptr;
188
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 176
diff changeset
100 std::string errmsg = "Unknown error";
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 FormatMessageA(
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 NULL,
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
105 errn,
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 (LPSTR)&str, 0, NULL);
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
188
ce3e1c3d6fed Update sockets to style and using instead of typedef
David Demelier <markand@malikania.fr>
parents: 176
diff changeset
110 if (str) {
260
2096edb63a4f Socket: fix Windows
David Demelier <markand@malikania.fr>
parents: 259
diff changeset
111 errmsg = std::string(str);
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 LocalFree(str);
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 return errmsg;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 #else
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
120 #include <cerrno>
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
121
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
122 std::string Socket::syserror(int errn)
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 {
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
124 return strerror(errn);
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 #endif
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
128
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
129 std::string Socket::syserror()
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 #if defined(_WIN32)
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
132 return syserror(WSAGetLastError());
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
133 #else
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
134 return syserror(errno);
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 #endif
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
138 /* --------------------------------------------------------
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
139 * Standard clear implementation
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
140 * -------------------------------------------------------- */
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
141
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
142 class Standard final : public SocketInterface {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
143 public:
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
144 void bind(Socket &s, const SocketAddress &address) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
145 void close(Socket &s) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
146 void connect(Socket &s, const SocketAddress &address) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
147 Socket accept(Socket &s, SocketAddress &info) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
148 void listen(Socket &s, int max) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
149 unsigned recv(Socket &s, void *data, unsigned len) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
150 unsigned recvfrom(Socket &s, void *data, unsigned len, SocketAddress &info) override ;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
151 unsigned send(Socket &s, const void *data, unsigned len) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
152 unsigned sendto(Socket &s, const void *data, unsigned len, const SocketAddress &info) override;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
153 };
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
154
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
155 void Standard::bind(Socket &s, const SocketAddress &addr)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
156 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
157 auto &sa = addr.address();
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
158 auto addrlen = addr.length();
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
159
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
160 if (::bind(s.handle(), (sockaddr *)&sa, addrlen) == SOCKET_ERROR)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
161 throw error::Failure("bind", Socket::syserror());
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
162 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
163
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
164 void Standard::connect(Socket &s, const SocketAddress &addr)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
165 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
166 auto &sa = addr.address();
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
167 auto addrlen = addr.length();
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
168
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
169 if (::connect(s.handle(), (sockaddr *)&sa, addrlen) == SOCKET_ERROR) {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
170 /*
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
171 * Determine if the error comes from a non-blocking connect that cannot be
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
172 * accomplished yet.
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
173 */
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
174 #if defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
175 if (WSAGetLastError() == WSAEWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
176 throw error::InProgress("connect");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
177
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
178 throw error::Failure("connect", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
179 #else
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
180 if (errno == EINPROGRESS)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
181 throw error::InProgress("connect");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
182
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
183 throw error::Failure("connect", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
184 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
185 }
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
186 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
187
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
188 Socket Standard::accept(Socket &s, SocketAddress &info)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
189 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
190 Socket::Handle handle;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
191
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
192 // Store the information
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
193 sockaddr_storage address;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
194 socklen_t addrlen;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
195
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
196 addrlen = sizeof (sockaddr_storage);
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
197 handle = ::accept(s.handle(), (sockaddr *)&address, &addrlen);
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
198
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
199 if (handle == INVALID_SOCKET)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
200 throw error::Failure("accept", Socket::syserror());
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
201
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
202 // Usually accept works only with SOCK_STREAM
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
203 info = SocketAddress(address, addrlen);
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
204
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
205 return Socket(handle, std::make_shared<Standard>());
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
206 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
207
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
208 void Standard::listen(Socket &s, int max)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
209 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
210 if (::listen(s.handle(), max) == SOCKET_ERROR)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
211 throw error::Failure("listen", Socket::syserror());
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
212 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
213
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
214 unsigned Standard::recv(Socket &s, void *data, unsigned dataLen)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
215 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
216 int nbread;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
217
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
218 nbread = ::recv(s.handle(), (Socket::Arg)data, dataLen, 0);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
219 if (nbread == SOCKET_ERROR) {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
220 #if defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
221 if (WSAGetLastError() == WSAEWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
222 throw error::WouldBlock("recv");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
223
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
224 throw error::Failure("recv", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
225 #else
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
226 if (errno == EAGAIN || errno == EWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
227 throw error::WouldBlock("recv");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
228
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
229 throw error::Failure("recv", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
230 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
231 }
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
232
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
233 return (unsigned)nbread;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
234 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
235
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
236 unsigned Standard::send(Socket &s, const void *data, unsigned dataLen)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
237 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
238 int nbsent;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
239
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
240 nbsent = ::send(s.handle(), (Socket::ConstArg)data, dataLen, 0);
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
241 if (nbsent == SOCKET_ERROR) {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
242 #if defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
243 if (WSAGetLastError() == WSAEWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
244 throw error::WouldBlock("send");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
245
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
246 throw error::Failure("send", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
247 #else
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
248 if (errno == EAGAIN || errno == EWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
249 throw error::WouldBlock("send");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
250
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
251 throw error::Failure("send", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
252 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
253 }
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
254
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
255 return (unsigned)nbsent;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
256 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
257
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
258 unsigned Standard::recvfrom(Socket &s, void *data, unsigned dataLen, SocketAddress &info)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
259 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
260 int nbread;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
261
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
262 // Store information
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
263 sockaddr_storage address;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
264 socklen_t addrlen;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
265
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
266 addrlen = sizeof (struct sockaddr_storage);
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
267 nbread = ::recvfrom(s.handle(), (Socket::Arg)data, dataLen, 0, (sockaddr *)&address, &addrlen);
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
268
259
0b3fcc5ed8eb Socket: forget to add address in recvfrom
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
269 info = SocketAddress(address, addrlen);
0b3fcc5ed8eb Socket: forget to add address in recvfrom
David Demelier <markand@malikania.fr>
parents: 258
diff changeset
270
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
271 if (nbread == SOCKET_ERROR) {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
272 #if defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
273 if (WSAGetLastError() == WSAEWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
274 throw error::WouldBlock("recvfrom");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
275
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
276 throw error::Failure("recvfrom", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
277 #else
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
278 if (errno == EAGAIN || errno == EWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
279 throw error::WouldBlock("recvfrom");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
280
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
281 throw error::Failure("recvfrom", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
282 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
283 }
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
284
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
285 return (unsigned)nbread;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
286 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
287
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
288 unsigned Standard::sendto(Socket &s, const void *data, unsigned dataLen, const SocketAddress &info)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
289 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
290 int nbsent;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
291
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
292 nbsent = ::sendto(s.handle(), (Socket::ConstArg)data, dataLen, 0, (const sockaddr *)&info.address(), info.length());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
293 if (nbsent == SOCKET_ERROR) {
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
294 #if defined(_WIN32)
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
295 if (WSAGetLastError() == WSAEWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
296 throw error::WouldBlock("sendto");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
297
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
298 throw error::Failure("sendto", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
299 #else
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
300 if (errno == EAGAIN || errno == EWOULDBLOCK)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
301 throw error::WouldBlock("sendto");
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
302
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
303 throw error::Failure("sendto", Socket::syserror());
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
304 #endif
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
305 }
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
306
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
307 return (unsigned)nbsent;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
308 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
309
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
310 void Standard::close(Socket &s)
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
311 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
312 (void)closesocket(s.handle());
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
313 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
314
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
315 /* --------------------------------------------------------
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
316 * Socket code
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
317 * -------------------------------------------------------- */
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
318
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
319 Socket::Socket()
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
320 : m_interface(std::make_shared<Standard>())
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
321 {
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
322 }
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
323
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 Socket::Socket(int domain, int type, int protocol)
280
91eb0583df52 Socket:
David Demelier <markand@malikania.fr>
parents: 276
diff changeset
325 : Socket()
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 {
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
327 m_handle = socket(domain, type, protocol);
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
328
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
329 if (m_handle == INVALID_SOCKET)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
330 throw error::Failure("socket", syserror());
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
332
282
ea55a3886da0 Socket:
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
333 Socket::Socket(Handle handle, std::shared_ptr<SocketInterface> iface)
ea55a3886da0 Socket:
David Demelier <markand@malikania.fr>
parents: 280
diff changeset
334 : m_interface(std::move(iface))
247
806dbb6011c7 Socket:
David Demelier <markand@malikania.fr>
parents: 246
diff changeset
335 , m_handle(handle)
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
336 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
337 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
338
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
339 Socket::Handle Socket::handle() const
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
340 {
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
341 return m_handle;
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
342 }
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
343
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 void Socket::blockMode(bool block)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 #if defined(O_NONBLOCK) && !defined(_WIN32)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 int flags;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
348
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
349 if ((flags = fcntl(m_handle, F_GETFL, 0)) == -1)
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 flags = 0;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
351
258
4ad3c85ab73e Sockets:
David Demelier <markand@malikania.fr>
parents: 247
diff changeset
352 if (block)
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 flags &= ~(O_NONBLOCK);
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 else
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 flags |= O_NONBLOCK;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
356
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
357 if (fcntl(m_handle, F_SETFL, flags) == -1)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
358 throw error::Failure("blockMode", Socket::syserror());
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 #else
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 unsigned long flags = (block) ? 0 : 1;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
361
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
362 if (ioctlsocket(m_handle, FIONBIO, &flags) == SOCKET_ERROR)
276
05f0a3e09cbf Socket:
David Demelier <markand@malikania.fr>
parents: 260
diff changeset
363 throw error::Failure("blockMode", Socket::syserror());
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 #endif
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
366
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 Socket Socket::accept()
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 SocketAddress dummy;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
370
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
371 return m_interface->accept(*this, dummy);
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
373
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 unsigned Socket::send(const std::string &message)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 return Socket::send(message.c_str(), message.length());
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
378
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 unsigned Socket::recvfrom(void *data, unsigned dataLen)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 SocketAddress dummy;
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
382
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
383 return m_interface->recvfrom(*this, data, dataLen, dummy);
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
385
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 unsigned Socket::sendto(const std::string &message, const SocketAddress &info)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 {
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 return sendto(message.c_str(), message.length(), info);
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 }
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
390
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 bool operator==(const Socket &s1, const Socket &s2)
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 {
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
393 return s1.handle() == s2.handle();
170
fd138f2a9773 Add C++ portable sockets
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 }
174
9f22bd478f21 Add operator less because widely used
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
395
175
73d8f140bc86 Add some getters
David Demelier <markand@malikania.fr>
parents: 174
diff changeset
396 bool operator<(const Socket &s1, const Socket &s2)
174
9f22bd478f21 Add operator less because widely used
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
397 {
245
3c12f0e8bbb9 Converter: add cstring missing
David Demelier <markand@malikania.fr>
parents: 236
diff changeset
398 return s1.handle() < s2.handle();
174
9f22bd478f21 Add operator less because widely used
David Demelier <markand@malikania.fr>
parents: 170
diff changeset
399 }