Last active
August 29, 2015 14:23
-
-
Save nicka101/2cc76b04786d0adefc56 to your computer and use it in GitHub Desktop.
Test ephemeral port allocation for routed connections
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <iostream> | |
#ifdef _WIN32 | |
#include <WS2tcpip.h> | |
#define LAST_ERR WSAGetLastError() | |
#define SOCK_INVALID(s) s == INVALID_SOCKET | |
#else | |
#define LAST_ERR errno | |
#define SOCK_INVALID(s) s < 0 | |
#include <sys/socket.h> | |
#include <sys/types.h> | |
#include <netinet/in.h> | |
#include <unistd.h> | |
#endif | |
const char data = 'A'; | |
int main(int argc, char** argv){ | |
#ifdef _WIN32 | |
{ | |
WSADATA wsadata; | |
WSAStartup(514, &wsadata); | |
} | |
#endif | |
struct sockaddr_in dest = { 0 }; | |
dest.sin_family = AF_INET; | |
dest.sin_addr.s_addr = htonl(3164981968); | |
dest.sin_port = htons(7001); | |
while(true){ | |
auto sock = socket(AF_INET, SOCK_DGRAM, 0); | |
if (SOCK_INVALID(sock)){ | |
std::cerr << "failed to create socket with error: " << LAST_ERR << std::endl; | |
continue; | |
} | |
auto res = sendto(sock, &data, 1, 0, (const struct sockaddr*)&dest, sizeof(dest)); | |
#ifdef _WIN32 | |
closesocket(sock); | |
#else | |
close(sock); | |
#endif | |
} | |
#ifdef _WIN32 | |
WSACleanup(); | |
#endif | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <iostream> | |
#include <vector> | |
#include <stdexcept> | |
#ifdef _WIN32 | |
#include <WS2tcpip.h> | |
#define LAST_ERR WSAGetLastError() | |
#define sock_t SOCKET | |
#define SOCK_INVALID(s) s == INVALID_SOCKET | |
#else | |
#define sock_t int | |
#define LAST_ERR errno | |
#define SOCK_INVALID(s) s < 0 | |
#include <sys/socket.h> | |
#include <sys/types.h> | |
#include <netinet/in.h> | |
#include <unistd.h> | |
#endif | |
sock_t create_socket(int family, int type, int port); | |
void recv_print_address(sock_t socket); | |
struct sockaddr_in* recd = nullptr; | |
int main(int argc, char** argv){ | |
#ifdef _WIN32 | |
WSADATA data; | |
WSAStartup(514, &data); | |
#endif | |
auto sock = create_socket(AF_INET, SOCK_DGRAM, 7001); | |
while(true) recv_print_address(sock); | |
#ifdef _WIN32 | |
closesocket(sock); | |
WSACleanup(); | |
#else | |
close(sock); | |
#endif | |
return 0; | |
} | |
sock_t create_socket(int family, int type, int port){ | |
auto sock = socket(family, type, 0); | |
if (SOCK_INVALID(sock)){ | |
std::cerr << "failed to create socket with error: " << LAST_ERR << std::endl; | |
exit(1); | |
} | |
struct sockaddr_in bind_addr = { 0 }; | |
bind_addr.sin_family = family; | |
bind_addr.sin_addr.s_addr = INADDR_ANY; | |
bind_addr.sin_port = htons(port); | |
if (bind(sock, (struct sockaddr*)&bind_addr, sizeof(bind_addr)) < 0){ | |
std::cerr << "failed to bind socket with error: " << LAST_ERR << std::endl; | |
exit(3); | |
} | |
return sock; | |
} | |
void recv_print_address(sock_t socket){ | |
recd = new struct sockaddr_in; | |
std::vector<unsigned char> data; | |
data.resize(1); | |
auto addr_len = sizeof(recd); | |
auto res = recvfrom(socket, (char*)data.data(), 1, 0, (struct sockaddr*)recd, (socklen_t*)&addr_len); | |
if(res != 1){ | |
std::cerr << "udp socket threw error with code: " << LAST_ERR << std::endl; | |
return; | |
} | |
std::cout << "Source port is: " << ntohs(recd->sin_port) << std::endl; | |
delete recd; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment