[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Working on keepalive messages while waiting for local connection


Hello all

I realized that SSH servers with the keep-alive option enabled first
send the keep-alive _global_ request as long as nothing had connected to
the local TCP socket:

$> ssh -v -N xxx@yyy -L 8088:testcom.com:80

    debug1: client_input_global_request: rtype keepalive@xxxxxxxxxxx
want_reply 1

After connecting to localhost:8088, these requests are sent over the
channel:

    debug1: client_input_channel_req: channel 2 rtype
keepalive@xxxxxxxxxxx reply 1

From this I conclude that the channel should not be opened before there
is a waiting connection on the local TCP socket.
But how do I tell libssh to work on the global request as long as there
is no open channel?

Maybe I have to use ssh_get_fd() and the use select() also on this
socket while waiting for the local incoming connections? And then use
ssh_set_fd_toread()?

I would appreciate a lot if someone could show me some sample code.

Best regards,
Till

On 09.04.2018 18:32, g4-lisz@xxxxxxxxxxxx wrote:
> Hi there
>
> I wrote some basic ssh client to forward a port. This involves binding a
> local listening socket and waiting for an application to connect. But as
> long as there is nothing connected to the local socket, the client is
> not reading from or writing to the channel. This seems to be an issue as
> soon as a SSH server sends keep alive messages: Because nothing is read
> from the client's side of the channel, libssh does not work on the
> keepalive messages.
>
> The pseudo code looks like this:
>
> socket = socket(PF_INET,...);
> bind(socket);
> listen(socket);
>
> while(1) {
>     do{ /* nada */ } while(  0 == select(socket,...) );
>    
>     forwardsock = accept(socket);
>     channel = ssh_channel_new(session);
>     ssh_channel_open_forward(channel, ...);
>
>     while(1) {
>         do{ /* nada */ } while( SSH_EINTR == ssh_select(channel,
> channelout,  forwardsock) );
>
>         if (FD_ISSET(forwardsock,...)) { /* read from socket and write
> to channel */ }
>
>         if (channelout) { /* read from channel and write to socket */ }
>
>         if (EOF) {break;}
>     }
>     close(forwardsock);
>     ssh_channel_close(channel);
> }
>
> Without keepalive messages from the server, all works fine.
>
> How can this issue be solved?
>
> Thanks,
> Till
>
>
>


Follow-Ups:
Re: Working on keepalive messages while waiting for local connectionAndreas Schneider <asn@xxxxxxxxxxxxxx>
Archive administrator: postmaster@lists.cynapses.org