187 // TODO: UDP receive() |
187 // TODO: UDP receive() |
188 return IncomingMessage("TODO: receive() a message"); |
188 return IncomingMessage("TODO: receive() a message"); |
189 } |
189 } |
190 }; |
190 }; |
191 |
191 |
|
192 class UDPServerSocket : public Socket { |
|
193 private: |
|
194 AddressInfos::AddressInfo localAddress; |
|
195 sockaddr_in6 remoteAddress = {}; |
|
196 useconds_t delay = 0; |
|
197 FD socket; |
|
198 |
|
199 public: |
|
200 |
|
201 UDPServerSocket(AddressInfos::AddressInfo remoteAddress) : localAddress(remoteAddress), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) { |
|
202 } |
|
203 |
|
204 static std::shared_ptr<Socket> open(const SocketOptions& options) { |
|
205 auto socket = openClientSocket<UDPServerSocket>(options, SOCK_DGRAM, IPPROTO_UDP); |
|
206 auto ai = socket->localAddress.ai; |
|
207 int reuseAddr = true; |
|
208 check(::setsockopt(socket->socket.getFD(), SOL_SOCKET, SO_REUSEADDR, &reuseAddr, sizeof (reuseAddr)), "setsockopt SO_REUSEADDR"); |
|
209 check(::bind(socket->socket.getFD(), ai->ai_addr, ai->ai_addrlen), "bind"); |
|
210 return socket; |
|
211 } |
|
212 |
|
213 void send(const OutgoingMessage& message) override { |
|
214 // receive a message first to get a remote address: |
|
215 char buffer[8192]; |
|
216 memset((char *) &remoteAddress, 0, sizeof (remoteAddress)); |
|
217 socklen_t remoteAddressSize = sizeof (remoteAddress); |
|
218 ssize_t msgSize = recvfrom(socket.getFD(), buffer, sizeof (buffer), 0, (sockaddr*) & remoteAddress, &remoteAddressSize); |
|
219 |
|
220 // respond with our messsage: |
|
221 sendto(socket.getFD(), message.data.c_str(), message.data.size(), 0, (sockaddr*) & remoteAddress, remoteAddressSize); |
|
222 } |
|
223 |
|
224 const IncomingMessage receive() override { |
|
225 // TODO: UDP receive() |
|
226 return IncomingMessage("TODO: receive() a message"); |
|
227 } |
|
228 }; |
|
229 |
192 class TCPClientSocket : public Socket { |
230 class TCPClientSocket : public Socket { |
193 private: |
231 private: |
194 AddressInfos::AddressInfo remoteAddress; |
232 AddressInfos::AddressInfo remoteAddress; |
195 |
233 |
196 public: |
234 public: |
330 static std::vector<std::shared_ptr<SocketFactory>> factories |
368 static std::vector<std::shared_ptr<SocketFactory>> factories |
331 { |
369 { |
332 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (), |
370 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (), |
333 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPServerSocket >> (), |
371 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPServerSocket >> (), |
334 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), |
372 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), |
335 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class |
373 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPServerSocket >> (), |
336 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (), |
374 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (), |
337 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class |
375 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class |
338 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (), |
376 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (), |
339 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class |
377 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class |
340 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class |
378 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class |