16 server_fd = socket(AF_INET, SOCK_STREAM, 0);
18 if (server_fd == INVALID_SOCKET) {
20 if (server_fd == -1) {
22 std::cerr <<
"Socket creation failed: " <<
35 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR,
reinterpret_cast<const char *
>(&opt),
sizeof(opt))) {
37 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT, &opt,
sizeof(opt))) {
42 std::cerr <<
"setsockopt failed: " << strerror(errno) << std::endl;
49 sockaddr_in address{};
50 address.sin_family = AF_INET;
51 address.sin_addr.s_addr = INADDR_ANY;
52 address.sin_port = htons(port);
55 if (bind(server_fd,
reinterpret_cast<sockaddr *
>(&address),
sizeof(address)) < 0) {
59 std::cerr <<
"Bind failed: " << strerror(errno) << std::endl;
66 if (listen(server_fd, 8) < 0) {
69 std::cerr <<
"Listen failed: " << strerror(errno) << std::endl;
78 ioctlsocket(server_fd, FIONBIO, &
mode);
80 int flags = fcntl(server_fd, F_GETFL);
81 fcntl(server_fd, F_SETFL, flags | O_NONBLOCK);
84 std::cout <<
"Server is listening on port " << port << std::endl;
89 sockaddr_in client_addr{};
91 int client_len =
sizeof(client_addr);
93 socklen_t client_len =
sizeof(client_addr);
96 auto client_socket = ::accept(server_fd,
reinterpret_cast<struct sockaddr *
>(&client_addr), &client_len);
99 if (client_socket != INVALID_SOCKET) {
101 if (client_socket >= 0) {
103 char client_ip[INET_ADDRSTRLEN];
104 inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN);
105 std::cout <<
"New connection from " << client_ip <<
":" << ntohs(client_addr.sin_port) << std::endl;
108 return EthernetClient(std::make_unique<NativeEthernetClientHAL>(client_socket));