[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Nonblocking Behaviour for .NET
[Thread Prev] | [Thread Next]
- Subject: Re: Nonblocking Behaviour for .NET
- From: Aris Adamantiadis <aris@xxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 30 May 2017 22:15:03 +0200
- To: libssh@xxxxxxxxxx
On 26/05/17 17:43, Jason Curl wrote:
>
> ssh_set_blocking(session, false);
> ssh_connect(session);
> fd = ssh_get_fd(session);
>
> // Here is where i have a wrapper library to do select(), with the fd
> returned above in the fd_set for writefds.
> FD_SET writefds;
> FD_ZERO(&writefds);
> FD_SET(fd, &writefds);
> sres = select(fd+1, NULL, &writefds, NULL, &timeout); // returns 1
> if (FD_ISSET(fd, &writefds)) rc = ssh_connect(session) // returns -2,
> indicating EAGAIN.
>
> I don't understand the code too well, but there's only one instance of
> SSH_AGAIN and that is:
> if(!ssh_is_blocking(session) &&!ssh_connect_termination(session)){
> returnSSH_AGAIN;
> }
>
> Is there a way to know the connect is finished, or do I have to
> continuously poll with connect?
Hi Jason,
You get SSH_AGAIN with the second ssh_connect because the socket is
connected, but the key exchange is not completed. We're currently short
on callbacks to announce that the connection is over (well, there's
ssh_status_callback but it wasn't really designed for this purpose), so
yes you have to continue polling (using your own select is fine) +
calling ssh_connect() until it returns != SSH_AGAIN.
the ssh_get_poll_flags() function will return the poll events that
libssh is currently waiting for (e.g. if the output socket is not empty,
SSH_WRITE_PENDING will be returned, and if it's expecting data to read
SSH_READ_PENDING will be set).
Aris
| Nonblocking Behaviour for .NET | Jason Curl <jason@xxxxxxxxxxxxxxxxxxxxxxxx> |
| Re: Nonblocking Behaviour for .NET | Jason Curl <jason@xxxxxxxxxxxxxxxxxxxxxxxx> |