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

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -