[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: example of a server
[Thread Prev] | [Thread Next]
- Subject: Re: example of a server
- From: Tomasz Mikolajczyk <tmmikolajczyk@xxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Mon, 16 Apr 2012 17:06:48 +0200
- To: libssh@xxxxxxxxxx
After further investigation the following seems to work (an echo SSH
server's pseudo code):
struct Context
{
ssh_session_struct* session;
ssh_channel_struct* channel;
}
int message_callback(ssh_session session, ssh_message_struct* message,
void *data)
{
Context* ctx = static_cast<Context*>(data);
.... processes message and sets the channel member in the ctx
struct in reaction for SSH_REQUEST_CHANNEL_OPEN msg type
return 0;
}
int main()
{
TCPSocket tcp;
select(tcp.fd);
ssh_bind_set_fd(tcp.fd);
ssh_session_struct* ses = ssh_new();
ssh_bind_accept(b, ses);
ssh_handle_key_exchange(ses);
Context ctx;
ctx.session = ses;
ssh_set_message_callback(ses, message_callback, &ctx);
ssh_set_blocking(ses, 0);
while(true)
{
select( ssh_get_fd(ses) );
ssh_execute_message_callbacks(ses); // PROCESS ALL
MESSAGES FROM THE QUEUE
if( ctx.channel != 0 )
{
std::vector<char> buf(512, '\0');
int num = ssh_channel_read(ctx.channel, &buf[0], buf.size(), 0);
if(num <= 0)
{
continue;
}
std::cout << std::string(&buf[0], num) << std::endl;
ssh_channel_write(ctx.channel, &buf[0], num);
}
} // while(true)
}
The ssh_execute_message_callbacks is not documented and not used in
any existing examples. I found it diving into the server.c
implementation. I'm not sure if I'm using it as designed for.
/Tomek
On Mon, Apr 16, 2012 at 12:35 PM, Tomasz Mikolajczyk
<tmmikolajczyk@xxxxxxxxx> wrote:
> Hi,
>
> Recently I started investigation of the libssh capabilities. I
> analyzed tutorial and various examples but couldn't find a sufficient
> example how to implement a non-blocking SSH server. I would like to
> achieve the following:
>
> 1) listening on a TCP socket on a predefined port
>
> 2) When there is a new connection on the socket I assume that it is a
> new ssh client's connection. Then I would like to pass the socket fd
> to the libssh saying "handle this connection as the ssh connection".
> Is the following pseudo code correct in order to do that?:
>
> ssh_bind_struct* b = ssh_bind_new()
> ssh_bind_set_blocking(b, 0)
> ssh_bind_listen(b)
>
> TCPSocket tcp;
> select(tcp.fd);
> ssh_bind_set_fd(tcp.fd);
>
> ssh_session_struct* ses = ssh_new()
> ssh_bind_accept(b, ses)
>
> 3) In the next step I would like to wait on another select and handle
> all the requests, like SSH_REQUEST_AUTH, SSH_REQUEST_CHANNEL_OPEN,
> SSH_REQUEST_CHANNEL and so on, but in the same time I would like to
> check/receive (in a non-blocking mode by waiting on the same select) a
> user-passed data. How to achieve that? The "ssh_message_get" is
> blocking so I cannot use it. I also found an example of
> reading/writing data using ssh_channel_read/ssh_channel_write
> functions, however the examples do not show how to receive user data
> (channel data) and in the same time handle messages such as
> pty-request.
>
> /Tomek
| Re: example of a server | Andreas Schneider <asn@xxxxxxxxxxxxxx> |
| example of a server | Tomasz Mikolajczyk <tmmikolajczyk@xxxxxxxxx> |