MCPcopy Create free account
hub / github.com/FastLED/FastLED / open

Method open

src/fl/stl/asio/ip/tcp.cpp.hpp:360–412  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

358acceptor::~acceptor() FL_NOEXCEPT { close(); }
359
360error_code acceptor::open(u16 port) {
361 close();
362
363#ifdef FL_IS_WIN
364 if (!initialize_winsock()) {
365 return error_code(errc::unknown, "winsock init failed");
366 }
367#endif
368
369 int sock = plat_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
370 if (sock < 0) {
371 return error_code(errc::unknown, "socket creation failed");
372 }
373
374 // SO_REUSEADDR for quick restarts
375 int reuse = 1;
376 plat_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse,
377 sizeof(reuse));
378
379 struct sockaddr_in addr {};
380 addr.sin_family = AF_INET;
381 addr.sin_port = htons(port);
382 // Bind to loopback for consistent behavior across platforms
383 // especially for port 0 (ephemeral port assignment)
384 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
385
386 int ret =
387 plat_bind(sock, (struct sockaddr *)&addr, sizeof(addr));
388 if (ret != 0) {
389 plat_close(sock);
390 return error_code(errc::address_in_use, "bind failed");
391 }
392
393 // Query actual port if 0 was requested
394 if (port == 0) {
395 struct sockaddr_in boundAddr {};
396 socklen_t addrLen = sizeof(boundAddr);
397 if (plat_getsockname(sock, (struct sockaddr *)&boundAddr,
398 &addrLen) != 0) {
399 plat_close(sock);
400 return error_code(errc::unknown, "getsockname failed - cannot resolve ephemeral port");
401 }
402 port = ntohs(boundAddr.sin_port);
403 }
404
405 mFd = sock;
406 mPort = port;
407
408 // Non-blocking — blocking is never appropriate on embedded
409 set_nonblocking(mFd, true);
410
411 return error_code();
412}
413
414error_code acceptor::listen(int backlog) {
415 if (mFd == -1) {

Callers 1

Calls 9

initialize_winsockFunction · 0.85
error_codeClass · 0.85
plat_socketFunction · 0.85
plat_setsockoptFunction · 0.85
plat_bindFunction · 0.85
plat_closeFunction · 0.85
plat_getsocknameFunction · 0.85
set_nonblockingFunction · 0.70
closeFunction · 0.50

Tested by

no test coverage detected