Ich benutze libssh.
Nach dem Aufruf ssh_channel_write
, muss ich wissen, ob es Daten zum Lesen gibt. (Aber ich möchte keine Daten abrufen.)
Wenn es keine Daten zum Lesen gibt (zum Beispiel nach 10s), werde ich wieder ssh_channel_write
aufrufen.
Beide von ssh_channel_read
und ssh_channel_read_nonblocking
können dies nicht tun. (Und die Überprüfung ssh_get_status
mit SSH_READ_PENDING funktioniert auch nicht.)
Gibt es Möglichkeiten, dieses Problem zu lösen?libssh woher weiß ich, ob dort Daten zu lesen sind?
2
A
Antwort
1
Es ist NonBlocking ...
Verwenden Sie die ssh_select (Funktion). Es funktioniert ganz ähnlich wie das reguläre select(), verwendet aber Kanäle anstelle von Sockets.
ssh_select int (* ssh_channel Kanäle, ssh_channel * outchannels, socket_t maxfd, fd_set readfds *, struct timeval * timeout);
Zum Beispiel kann eine Einkanal-Implementierung:
ssh_channel channels[2];
ssh_channel myChannel = ssh_channel_new (ssh_session session);
channels[0] = myChannel;
channels[1] = NULL;
struct timeval timeout = (0, 200000); // 0 seconds, 200 millis
int rc = ssh_select (channels, NULL, NULL, NULL, &timeout);
if (rc > 0) {// There is a pending data.
if (rc < 0) // the ssh_select() error.
if (rc == 0) // You've got a broken connection.
tatsächlich, ich 'ssh_channel_read_nonblocking' diese Arbeit endlich zu tun. – Caesar