Skip to content

Instantly share code, notes, and snippets.

@nicka101
Last active August 29, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nicka101/2cc76b04786d0adefc56 to your computer and use it in GitHub Desktop.
Save nicka101/2cc76b04786d0adefc56 to your computer and use it in GitHub Desktop.
Test ephemeral port allocation for routed connections
#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;
}
#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