117
134
in_port_t get_free_port()
119
in_port_t ret_port= in_port_t(0);
136
const in_port_t default_port= in_port_t(-1);
121
138
int retries= 1024;
123
141
while (--retries)
143
ret_port= default_port;
126
145
if ((sd= socket(AF_INET, SOCK_STREAM, 0)) != -1)
129
148
if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) != -1)
131
150
struct sockaddr_in sin;
133
152
sin.sin_addr.s_addr= 0;
134
153
sin.sin_addr.s_addr= INADDR_ANY;
135
154
sin.sin_family= AF_INET;
137
if (bind(sd, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) != -1)
139
socklen_t addrlen= sizeof(sin);
141
if (getsockname(sd, (struct sockaddr *)&sin, &addrlen) != -1)
143
ret_port= sin.sin_port;
148
all_socket_fd._pair.push_back(std::make_pair(sd, ret_port));
159
if ((bind_ret= bind(sd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in) )) != -1)
161
socklen_t addrlen= sizeof(sin);
163
if (getsockname(sd, (struct sockaddr *)&sin, &addrlen) != -1)
165
ret_port= sin.sin_port;
170
if (errno != EADDRINUSE)
172
Error << strerror(errno);
176
if (errno == EADDRINUSE)
178
libtest::dream(2, 0);
180
} while (bind_ret == -1 and errno == EADDRINUSE);
182
all_socket_fd._pair.push_back(std::make_pair(sd, ret_port));
186
Error << strerror(errno);
191
Error << strerror(errno);
194
if (ret_port == default_port)
196
Error << "no ret_port set:" << strerror(errno);
198
else if (ret_port > 1024 and ret_port != all_socket_fd.last_port)
165
212
fatal_message("No port could be found");
215
if (ret_port == default_port)
217
fatal_message("No port could be found");
168
220
if (ret_port <= 1024)
170
222
fatal_message("No port could be found, though some where available below or at 1024");
225
all_socket_fd.last_port= ret_port;
226
release_port(ret_port);