обнаружить закрытое клиентское соединение на сервере grpc - PullRequest
0 голосов
/ 02 ноября 2019

В примере unary RPC, предоставленном в grpc Github ( client ) и ( server ), есть ли способ обнаружить закрытое соединение клиента?

Например, в файле server.cc:

std::string prefix("Hello ");
reply_.set_message(prefix + request_.name());

// And we are done! Let the gRPC runtime know we've finished, using the
// memory address of this instance as the uniquely identifying tag for
// the event.
status_ = FINISH;
int p = 0,i=0;
while(i++ < 1000000000) { // some dummy work
        p = p + 10;
}
responder_.Finish(reply_, Status::OK, this);

С помощью этой фиктивной задачи перед отправкой ответа клиенту серверу потребуется несколько секунд. Если мы закроем клиента (например, с помощью Ctrl+C), сервер не выдаст никакой ошибки. Он просто вызывает Finish, а затем освобождает объект, как если бы Finish был успешным.

Есть ли какая-либо функция async (функция-обработчик) на стороне сервера, чтобы мы получили уведомление о том, что клиент имеетсоединение закрыто или клиент разорван?

Спасибо!

1 Ответ

1 голос
/ 03 ноября 2019

К сожалению, нет.

Но теперь ребята из команды gRPC усердно работают над внедрением механизма обратного вызова в реализацию C ++. Как я понимаю, он будет работать так же, как и в реализации Java (https://youtu.be/5tmPvSe7xXQ?t=1843).

Вы можете увидеть, как работать с будущим API, на следующих примерах: client_callback.cc и server_callback.cc

И вас интересует класс ServerBidiReactor из ::grpc::experimental пространства имен для серверной стороны. У него есть OnDone и OnCancel методы уведомлений, которые могут вам помочь.

Еще один интересный момент заключается в том, что вы можете хранить указатели на объект подключения и отправлять уведомления клиенту в любое время.

Но у него все еще много проблем, и я не рекомендую использовать этот API в рабочем коде. Текущий прогресс в реализации обратных вызовов C ++ вы можете увидеть там: https://github.com/grpc/grpc/projects/12#card-12554506

...