zeromq поднять исключение в потоке ввода / вывода - PullRequest
0 голосов
/ 28 сентября 2018

когда мы отправляем неверные данные в сокет zmq, поток ввода-вывода вызывает исключение и процесс уничтожается.Стек вызовов сбоя выглядит так:

00 KERNELBASE! RaiseException + 0x68
01 zmq :: zmq_abort (char * errmsg_ =) + 0x21 [objdir-windows-msvc-14.0.x86_64 \ build\ libzmq \ src \ err.cpp @ 89]
02 zmq :: tcp_read (без знака int64 s_ =, void * data_ =, без знака int64 size_ =) + 0xa9 [objdir-windows-msvc-14.0.x86_64 \ build \libzmq \ src \ tcp.cpp @ 276]
03 zmq :: stream_engine_t :: in_event (void) + 0x132 [objdir-windows-msvc-14.0.x86_64 \ build \ libzmq \ src \ stream_engine.cpp @ 318]
04 zmq :: select_t :: trigger_events (класс std :: vector> * fd_entries_ = 0x0000019d 323400c8, struct zmq::select_t::fds_set_t * local_fds_set_ = 0x0000006f e3f9fb90, int event_count_ = 0n2) + 0x74 [objdir-windows-msvc-14.0.x86_64 \ build \ libzmq \ sccselect.cpp @ 122]
05 zmq :: select_t :: select_family_entry (struct zmq :: select_t :: family_entry_t * family_entry_ = 0x0000019d 323400c8, int max_fd_ = 0n0, bool use_timeout_ = <Value unavailable error>, struct timeval * tv_ = 0x0000006f e3fffc98) + 0xe9 [objdir-windows-msvc-14.0.x86_64 \ buildlibzmq \ src \ select.cpp @ 404] 06 zmq :: select_t :: loop (void) + 0x352 [objdir-windows-msvc-14.0.x86_64 \ build \ libzmq \ src \ select.cpp @ 360]
07thread_routine (void * arg_ =) + 0xd [objdir-windows-msvc-14.0.x86_64 \ build \ libzmq \ src \ thread.cpp @ 47]
08 invoke_thread_procedure + 0xe (встроенная функция @ 00007ff7`50b99cf9) [d:\ th \ minkernel \ crts \ ucrt \ src \ appcrt \ startup \ thread.cpp @ 91]

Может кто-нибудь помочь, пожалуйста, как поймать это исключение?

1 Ответ

0 голосов
/ 02 октября 2018

Чтобы помочь вам, хотя слишком мало подробностей, чтобы правильно ответить:

С https://github.com/zeromq/libzmq/blob/master/src/tcp.cpp

int zmq::tcp_read (fd_t s_, void *data_, size_t size_)
{
#ifdef ZMQ_HAVE_WINDOWS

const int rc =
  recv (s_, static_cast<char *> (data_), static_cast<int> (size_), 0);

//  If not a single byte can be read from the socket in non-blocking mode
//  we'll get an error (this may happen during the speculative read).
if (rc == SOCKET_ERROR) {
    const int last_error = WSAGetLastError ();
    if (last_error == WSAEWOULDBLOCK) {
        errno = EAGAIN;
    } else {
        wsa_assert (
          last_error == WSAENETDOWN || last_error == WSAENETRESET
          || last_error == WSAECONNABORTED || last_error == WSAETIMEDOUT
          || last_error == WSAECONNRESET || last_error == WSAECONNREFUSED
          || last_error == WSAENOTCONN);
        errno = wsa_error_to_errno (last_error);
    }
}
return rc == SOCKET_ERROR ? -1 : rc;
#else

Очевидно, что трассировка стека показывает прерываниепоэтому я ожидаю, что это от assert, который затем вызывает abort или Повышение исключения в Windows:

https://github.com/zeromq/libzmq/blob/master/src/err.cpp

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

В любом случае, удачи, и вам нужно публиковать больше, чем это, чтобы получить лучшие ответы - на что похож получатель, что вы отправляете и чего вы на самом деле ожидаете ...

...