diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp')
-rw-r--r-- | lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp b/lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp new file mode 100644 index 0000000..5fc719f --- /dev/null +++ b/lib/libUPnP/Neptune/Source/Apps/NetPing/NetPing.cpp @@ -0,0 +1,218 @@ +/***************************************************************** +| +| Neptune Utilities - Network Ping Client +| +| (c) 2001-2005 Gilles Boccon-Gibod +| Author: Gilles Boccon-Gibod (bok@bok.net) +| + ****************************************************************/ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "NptConfig.h" +#include "Neptune.h" +#include "NptDebug.h" + +#if defined(NPT_CONFIG_HAVE_STDLIB_H) +#include <stdlib.h> +#endif + +#if defined(NPT_CONFIG_HAVE_STRING_H) +#include <string.h> +#endif + +#if defined(NPT_CONFIG_HAVE_STDIO_H) +#include <stdio.h> +#endif + +/*---------------------------------------------------------------------- +| types ++---------------------------------------------------------------------*/ +typedef enum { + CLIENT_TYPE_UNKNOWN, + CLIENT_TYPE_UDP, + CLIENT_TYPE_TCP +} ClientType; + +/*---------------------------------------------------------------------- +| globals ++---------------------------------------------------------------------*/ +static struct { + bool verbose; +} Options; + +/*---------------------------------------------------------------------- +| PrintUsageAndExit ++---------------------------------------------------------------------*/ +static void +PrintUsageAndExit(void) +{ + fprintf(stderr, + "usage: NetPing udp|tcp <hostname> <port>\n"); + exit(1); +} + +/*---------------------------------------------------------------------- +| UdpPing ++---------------------------------------------------------------------*/ +static void +UdpPing(const char* hostname, int port) +{ + NPT_UdpSocket sender; + NPT_Result result; + + // build ping packet + NPT_DataBuffer packet; + const char* packet_data = "PING"; + packet.SetData((NPT_Byte*)packet_data, 4); + + // resolve hostname + NPT_IpAddress ip_address; + result = ip_address.ResolveName(hostname); + if (NPT_FAILED(result)) { + fprintf(stderr, "ERROR: failed to resolve name\n"); + return; + } + + // get the current timestamp + NPT_TimeStamp before; + NPT_System::GetCurrentTimeStamp(before); + + // send the packet + sender.Connect(NPT_SocketAddress(ip_address, port)); + sender.Send(packet); + //NPT_SocketAddress destination_address(ip_address, port); + //sender.Send(packet, &destination_address); + NPT_SocketInfo socket_info; + sender.GetInfo(socket_info); + printf("send from %s:%d to %s:%d\n", + socket_info.local_address.GetIpAddress().ToString().GetChars(), + socket_info.local_address.GetPort(), + socket_info.remote_address.GetIpAddress().ToString().GetChars(), + socket_info.remote_address.GetPort()); + //sender.Connect(NPT_SocketAddress(ip_address, port)); + NPT_SocketAddress destination_address(ip_address, port); + sender.Send(packet, &destination_address); + //NPT_SocketInfo socket_info; + //sender.GetInfo(socket_info); + //NPT_Debug("sent from %s:%d to %s:%d\n", + // socket_info.local_address.GetIpAddress().ToString().GetChars(), + // socket_info.local_address.GetPort(), + // socket_info.remote_address.GetIpAddress().ToString().GetChars(), + // socket_info.remote_address.GetPort()); + printf("send %d bytes\n", 4); + + // receive response + NPT_DataBuffer response(32768); + result = sender.Receive(response); + if (NPT_FAILED(result)) { + fprintf(stderr, "ERROR: failed to receive response (%d)\n", result); + return; + } + sender.GetInfo(socket_info); + printf("RESPONSE: %d bytes from %s:%d\n", + response.GetDataSize(), + socket_info.remote_address.GetIpAddress().ToString().GetChars(), + socket_info.remote_address.GetPort()); + + NPT_TimeStamp after; + NPT_System::GetCurrentTimeStamp(after); + NPT_TimeInterval i = after-before; + printf("RTT: %f ms\n", ((float)i)*1000.0f); +} + +/*---------------------------------------------------------------------- +| TcpPing ++---------------------------------------------------------------------*/ +static void +TcpPing(const char* hostname, int port) +{ + NPT_TcpClientSocket sender; + NPT_Result result; + + // resolve name + NPT_IpAddress ip_address; + result = ip_address.ResolveName(hostname); + if (NPT_FAILED(result)) { + fprintf(stderr, "ERROR: failed to resolve name\n"); + return; + } + + // connect to server + result = sender.Connect(NPT_SocketAddress(ip_address, port)); + if (NPT_FAILED(result)) { + fprintf(stderr, "ERROR: Connect() failed (%d)\n", result); + return; + } + NPT_OutputStreamReference output; + + // get the current timestamp + NPT_TimeStamp before; + NPT_System::GetCurrentTimeStamp(before); + + // send the ping + sender.GetOutputStream(output); + output->Write("PING", 4); + + // receive response + NPT_InputStreamReference input; + sender.GetInputStream(input); + char buffer[1024]; + + NPT_Size bytes_read; + result = input->Read(buffer, sizeof(buffer), &bytes_read); + if (NPT_SUCCEEDED(result)) { + printf("read %d bytes\n", bytes_read); + } else { + fprintf(stderr, "ERROR: Read() failed (%d)\n", result); + } + + NPT_TimeStamp after; + NPT_System::GetCurrentTimeStamp(after); + NPT_TimeInterval i = after-before; + printf("RTT: %f ms\n", ((float)i)*1000.0f); +} + +/*---------------------------------------------------------------------- +| main ++---------------------------------------------------------------------*/ +int +main(int argc, char** argv) +{ + // check command line + if (argc != 4) { + PrintUsageAndExit(); + } + + // init options + Options.verbose = false; + ClientType client_type = CLIENT_TYPE_UNKNOWN; + int port = -1; + char* hostname = NULL; + + // parse command line + if (!strcmp(argv[1], "udp")) { + client_type = CLIENT_TYPE_UDP; + } else if (!strcmp(argv[1], "tcp")) { + client_type = CLIENT_TYPE_TCP; + } else { + fprintf(stderr, "ERROR: unknown client type\n"); + exit(1); + } + + hostname = argv[2]; + port = strtoul(argv[3], NULL, 10); + + switch (client_type) { + case CLIENT_TYPE_TCP: TcpPing(hostname, port); break; + case CLIENT_TYPE_UDP: UdpPing(hostname, port); break; + default: break; + } + + return 0; +} + + + + |