bool TCPClientPort::Connect(const char *host, unsigned port) { NarrowString<32> service; service.UnsafeFormat("%u", port); StaticSocketAddress address; if (!address.Lookup(host, service, AF_INET)) return false; SocketDescriptor s; if (!s.CreateTCP()) return false; #ifdef HAVE_POSIX s.SetNonBlocking(); #endif if (s.Connect(address)) { Set(std::move(s)); return true; } #ifdef HAVE_POSIX if (errno == EINPROGRESS) { connecting = std::move(s); io_thread->LockAdd(connecting.ToFileDescriptor(), Poll::WRITE, *this); StateChanged(); return true; } #endif return false; }
int main(int argc, char **argv) { // Determine on which TCP port to connect to the server const char *tcp_port; if (argc < 2) { fprintf(stderr, "This program opens a TCP connection to a server which is assumed "); fprintf(stderr, "to be at 127.0.0.1, and sends artificial FlyNet vario data.\n\n"); fprintf(stderr, "Usage: %s PORT\n", argv[0]); fprintf(stderr, "Defaulting to port 4353\n"); tcp_port = "4353"; } else { tcp_port = argv[1]; } // Convert IP address to binary form SocketAddress server_address; if (!server_address.Lookup("127.0.0.1", tcp_port, AF_INET)) { fprintf(stderr, "Failed to look up address\n"); exit(EXIT_FAILURE); } // Create socket for the outgoing connection SocketDescriptor sock; if (!sock.CreateTCP()) { perror("Socket"); exit(EXIT_FAILURE); } // Connect to the specified server if (!sock.Connect(server_address)) { perror("Connect"); exit(EXIT_FAILURE); } PeriodClock start_clock; start_clock.Update(); PeriodClock pressure_clock; PeriodClock battery_clock; fixed pressure = fixed(101300); unsigned battery_level = 11; while (true) { if (pressure_clock.CheckUpdate(48)) { NarrowString<16> sentence; int elapsed_ms = start_clock.Elapsed(); fixed elapsed = fixed(elapsed_ms) / 1000; fixed vario = sin(elapsed / 3) * cos(elapsed / 10) * cos(elapsed / 20 + fixed(2)) * fixed(3); fixed pressure_vario = -vario * fixed(12.5); fixed delta_pressure = pressure_vario * 48 / 1000; pressure += delta_pressure; sentence = "_PRS "; sentence.AppendFormat("%08X", uround(pressure)); sentence += "\n"; sock.Write(sentence.c_str(), sentence.length()); } if (battery_clock.CheckUpdate(11000)) { NarrowString<16> sentence; sentence = "_BAT "; if (battery_level <= 10) sentence.AppendFormat("%X", battery_level); else sentence += "*"; sentence += "\n"; sock.Write(sentence.c_str(), sentence.length()); if (battery_level == 0) battery_level = 11; else battery_level--; } } return EXIT_SUCCESS; }