c++ - Bind socket to a free port from non-ephemeral port range -
it common knowledge in order bind socket fd random free port, pass 0
sockaddr_in.sin_port
bind
. however, seems assign port ephemeral port range, illustrated below program [*].
my question is, there [clean] way random port non-ephemeral port range?
[*]
#include <fstream> #include <iostream> #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> using namespace std; int main(int argc, char* argv[]) { fstream ports("/proc/sys/net/ipv4/ip_local_port_range", fstream::in); int emin, emax; ports >> emin >> emax; cout << "ephemeral range: [" << emin << ", " << emax << "]" << endl; (int = 0; < 100; ++i) { int fd = socket(pf_inet, sock_stream, 0); sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = af_inet; addr.sin_addr.s_addr = inaddr_any; socklen_t addrlen = sizeof(addr); bind(fd, (sockaddr*)(&addr), addrlen); getsockname(fd, (sockaddr*)(&addr), &addrlen); uint16_t port = ntohs(addr.sin_port); bool within = (port >= emin) && (port <= emax); cout << "port " << port << " " << (within ? "in" : "out") << endl; close(fd); } return 0; }
p.s. right workaround i'm using explicitly pass random port number non-ephemeral port range sockaddr_in.sin_port
, try bind it, rinse-repeat if bind operation failed. feels emulating system should provide.
right workaround i'm using explicitly pass random port number non-ephemeral port range
sockaddr_in.sin_port
, try bind it, rinse-repeat if bind operation failed. feels emulating system should provide.
sadly, need do. there no standard or platform-specific api selecting available random port range of non-ephemeral ports. os knows ephemeral ports, range part of networking configuration.
Comments
Post a Comment