+in_port_t get_free_port()
+{
+ in_port_t ret_port= in_port_t(0);
+ int sd;
+ if ((sd= socket(AF_INET, SOCK_STREAM, 0)) != -1)
+ {
+ int optval= 1;
+ if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) != -1)
+ {
+ struct sockaddr_in sin;
+ sin.sin_port= 0;
+ sin.sin_addr.s_addr= 0;
+ sin.sin_addr.s_addr= INADDR_ANY;
+ sin.sin_family= AF_INET;
+
+ if (bind(sd, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) != -1)
+ {
+ socklen_t addrlen= sizeof(sin);
+
+ if (listen(sd, 100) != -1)
+ {
+ if (getsockname(sd, (struct sockaddr *)&sin, &addrlen) != -1)
+ {
+ ret_port= sin.sin_port;
+ }
+ }
+ }
+ }
+
+ close(sd);
+ }
+
+ return ret_port;
+}
+