[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [BUG] ssh_bind_listen() does not fail in windows when port is in use
[Thread Prev] | [Thread Next]
- Subject: Re: [BUG] ssh_bind_listen() does not fail in windows when port is in use
- From: Alberto Garcia <agarciaillera@xxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Thu, 21 Mar 2019 16:53:20 -0700
- To: libssh@xxxxxxxxxx
I found a workaround.
In my code I created a similar bind_socket() function:
/* This is a copy to libssh bind_socket() but without setting SO_REUSEADDR
so we can detect when an port is in use*/
socket_t SSHServer::bind_socket_non_reuse(ssh_bind sshbind, const char*
hostname,
int port) {
char port_c[6];
struct addrinfo* ai;
struct addrinfo hints;
int opt = 1;
socket_t s;
int rc;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_socktype = SOCK_STREAM;
snprintf(port_c, 6, "%d", port);
rc = getaddrinfo(hostname, port_c, &hints, &ai);
if (rc != 0) {
return SSH_INVALID_SOCKET;
}
s = socket(ai->ai_family,
ai->ai_socktype,
ai->ai_protocol);
if (s == SSH_INVALID_SOCKET) {
freeaddrinfo(ai);
return SSH_INVALID_SOCKET;
}
// this is the part that I deleted
//if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
// (char*)& opt, sizeof(opt)) < 0) {
// /* ssh_set_error(sshbind,
// SSH_FATAL,
// "Setting socket options failed: %s",
// strerror(errno));*/
// freeaddrinfo(ai);
// CLOSE_SOCKET(s);
// return -1;
//}
if (bind(s, ai->ai_addr, ai->ai_addrlen) != 0) {
freeaddrinfo(ai);
CLOSE_SOCKET(s);
return SSH_INVALID_SOCKET;
}
freeaddrinfo(ai);
if (listen(s, 10) < 0) {
CLOSE_SOCKET(s);
return SSH_INVALID_SOCKET;
}
return s;
}
Is like the original one but without setsockopt() setting SO_REUSEADDR and
calling listen() at the end (just as ssh_bind_listen() does).
And from the main code:
ssh_session session;
/* Create and configure the ssh session. */
ssh_bind sshbind = ssh_bind_new();
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, ip);
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT, &port);
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY,
&verbosity);
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY_MEMORY,
priv_key.c_str()); // loads keys from memory
socket_t fd = bind_socket_non_reuse(sshbind, ip, port);
if (fd == SSH_INVALID_SOCKET){
debug("Error listening to socket: %s\n", ssh_get_error(sshbind));
exit(1);
}
ssh_bind_set_fd(sshbind, fd);
This way I set my own fd which does not have SO_REUSEADDR set in it.
On Thu, Mar 21, 2019 at 4:40 PM <g4-lisz@xxxxxxxxxxxx> wrote:
> On 22.03.19 00:15, Alberto Garcia wrote:
> > The socket has the SO_REUSEADDR so it does not fail when it is in use.
> > I don't know why that's set. Does anyone knows what is the intention
> > of it?
>
> Look here:
>
> https://stackoverflow.com/questions/577885/what-are-the-use-cases-of-so-reuseaddr
>
> I think it's for the reason the guy there explains: To be able to
> reconnect to the same socket without having to wait until TIME_WAIT
> state is over.
>
>
>
--
Alberto García Illera
GPG Public Key <https://goo.gl/yshdwh>
| Re: [BUG] ssh_bind_listen() does not fail in windows when port is in use | g4-lisz@xxxxxxxxxxxx |
| [BUG] ssh_bind_listen() does not fail in windows when port is in use | Alberto Garcia <agarciaillera@xxxxxxxxx> |
| Re: [BUG] ssh_bind_listen() does not fail in windows when port is in use | Alberto Garcia <agarciaillera@xxxxxxxxx> |
| Re: [BUG] ssh_bind_listen() does not fail in windows when port is in use | g4-lisz@xxxxxxxxxxxx |