| 293 | } |
| 294 | |
| 295 | SC::Result SC::SocketTest::socketClientAcceptSnippet() |
| 296 | { |
| 297 | SocketDescriptor serverSocket; |
| 298 | SocketServer server(serverSocket); |
| 299 | |
| 300 | // Look for an available port |
| 301 | constexpr int tcpPort = 5050; |
| 302 | const StringView serverAddress = "::1"; // or "127.0.0.1" |
| 303 | SocketIPAddress nativeAddress; |
| 304 | SC_TRY(nativeAddress.fromAddressPort(serverAddress, tcpPort)); |
| 305 | |
| 306 | // Create (TCP) socket and start listening |
| 307 | SC_TRY(serverSocket.create(nativeAddress.getAddressFamily())); |
| 308 | SC_TRY(server.bind(nativeAddress)); |
| 309 | SC_TRY(server.listen(1)); // Start listening (skip this for UDP sockets) |
| 310 | |
| 311 | SocketFlags::AddressFamily family; |
| 312 | SC_TEST_EXPECT(serverSocket.getAddressFamily(family)); |
| 313 | |
| 314 | //! [socketClientAcceptSnippet] |
| 315 | SocketDescriptor acceptedClientSocket; |
| 316 | // ... assuming to obtain a TCP socket using SocketServer::accept |
| 317 | SC_TRY(server.accept(family, acceptedClientSocket)); |
| 318 | SC_TRY(acceptedClientSocket.isValid()); |
| 319 | |
| 320 | // Read some data blocking until it's available |
| 321 | char buf[256]; |
| 322 | |
| 323 | SocketClient acceptedClient(acceptedClientSocket); |
| 324 | Span<char> readData; |
| 325 | SC_TRY(acceptedClient.read({buf, sizeof(buf)}, readData)); |
| 326 | |
| 327 | // ... later on |
| 328 | |
| 329 | // Read again blocking but with a timeout of 10 seconds |
| 330 | SC_TRY(acceptedClient.readWithTimeout({buf, sizeof(buf)}, readData, 10 * 1000)); |
| 331 | |
| 332 | // Close the client |
| 333 | SC_TRY(acceptedClientSocket.close()); |
| 334 | //! [socketClientAcceptSnippet] |
| 335 | return Result(true); |
| 336 | } |
| 337 | |
| 338 | SC::Result SC::SocketTest::socketClientConnectSnippet() |
| 339 | { |