2

What is the recommended way of using libssh2 to implement the “read data from whichever channel has it first” primitive? E.g. I have a simple two-tab terminal program, where each tab corresponds to a LIBSSH2 channel. I want to wait until ANY of the 2 channels gets data and then print it.

The single-channel examples use libssh2_channel_read() in a non-blocking way like this:

while(not done) {
    1.  Try reading with libssh2_channel_read()
    2.  If returned LIBSSH2_ERROR_EAGAIN, wait with select()
}

The trivial way of extending this to two-channel case would be:

while(not done) {
    1.  Try reading channel 1
    2.  Try reading channel 2
    3.  If BOTH channels returned LIBSSH2_ERROR_EAGAIN, wait with select()
}

This leads to a rare bug when a packet with some data for channel 1 arrives just before reading channel 2. Then both calls return LIBSSH2_ERROR_EAGAIN, but as the attempt to read channel 2 actually recv()’d the data for channel 1, select() will now hang.

The workaround I am currently employing involves keeping raw data counters for the socket and using them to determine if any new data was consumed by libssh2, but I get the feeling of making a really complex workaround for a fairly simple problem. Am I missing something? Is there some kind of libssh2_session_read_any_channel()?

Ivan Shcherbakov
  • 2,063
  • 14
  • 23

0 Answers0