|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <netinet/in.h> |
|
#include <resolv.h> |
|
#include <arpa/nameser.h> |
|
#include <netdb.h> // Include for hstrerror |
|
//#include <android/multinetwork.h> |
|
#include <dlfcn.h> |
|
// #include <jni.h> |
|
#include <stdio.h> |
|
#include <poll.h> |
|
|
|
#include <errno.h> |
|
#include <iostream> |
|
|
|
#include <iostream> |
|
#include <iomanip> |
|
#include <cstring> |
|
|
|
void printHexDump(const char* buffer, size_t length) { |
|
for (size_t i = 0; i < length; ++i) { |
|
if (i > 0 && i % 16 == 0) { |
|
std::cout << std::endl; |
|
} |
|
std::cout << std::hex << std::setw(2) << std::setfill('0') << (static_cast<int>(buffer[i]) & 0xff) << " "; |
|
} |
|
std::cout << std::endl; |
|
} |
|
|
|
int main() { |
|
void* handle = dlopen("libandroid_net.so", RTLD_LAZY); |
|
if (!handle) { |
|
fprintf(stderr, "Error: %s\n", dlerror()); |
|
return 1; // or handle the error as needed |
|
} |
|
|
|
auto android_res_nquery = (int (*)(...)) dlsym(handle, "android_res_nquery"); |
|
if (!android_res_nquery) { |
|
fprintf(stderr, "Error: %s\n", dlerror()); |
|
dlclose(handle); |
|
return 1; // or handle the error as needed |
|
} |
|
|
|
int resp_handle = android_res_nquery(0, "google.com", ns_c_in, 65, 0); |
|
|
|
printf("%d\n", resp_handle); |
|
|
|
struct pollfd fds; |
|
fds.fd = resp_handle; |
|
fds.events = POLLIN; // Wait for read events |
|
// Wait for an event on the file descriptor |
|
int ret = poll(&fds, 1, -1); // -1 means no timeout |
|
|
|
if (ret == -1) { |
|
std::cerr << "Poll error: " << strerror(errno) << '\n'; |
|
} else if (ret == 0) { |
|
std::cout << "No data within the timeout period.\n"; |
|
} else { |
|
if (fds.revents & POLLIN) { |
|
std::cout << "Data is available to read.\n"; |
|
} |
|
} |
|
|
|
int rcode; |
|
|
|
char answer[3200]; |
|
|
|
ssize_t bytes_received = recv(resp_handle, answer, 3200 - 1, 0); |
|
if (bytes_received == -1) { |
|
std::cerr << "recv failed: " << strerror(errno) << std::endl; |
|
} else if (bytes_received == 0) { |
|
std::cout << "Connection closed by peer" << std::endl; |
|
} else { |
|
std::cout << "Received " << bytes_received << " bytes: " << answer << std::endl; |
|
} |
|
|
|
printHexDump(answer, bytes_received); |
|
return 0; |
|
} |