2016-07-24 12 views
2

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?

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. 
+0

tatsächlich, ich 'ssh_channel_read_nonblocking' diese Arbeit endlich zu tun. – Caesar

Verwandte Themen