void mitk::IGTLClient::Receive()
{
  //try to receive a message, if the socket is not present anymore stop the
  //communication
  unsigned int status = this->ReceivePrivate(this->m_Socket);
  if ( status == IGTL_STATUS_NOT_PRESENT )
  {
    this->StopCommunicationWithSocket(this->m_Socket);
    //inform observers about loosing the connection to this socket
    this->InvokeEvent(LostConnectionEvent());
    MITK_WARN("IGTLClient") << "Lost connection to server socket.";
  }
}
Exemple #2
0
void mitk::IGTLServer::Receive()
{
  unsigned int status = IGTL_STATUS_OK;
  SocketListType socketsToBeRemoved;

  //the server can be connected with several clients, therefore it has to check
  //all registered clients
  SocketListIteratorType it;
  m_ReceiveListMutex->Lock();
  auto it_end = this->m_RegisteredClients.end();
  for (it = this->m_RegisteredClients.begin(); it != it_end; ++it)
  {
    //it is possible that ReceivePrivate detects that the current socket is
    //already disconnected. Therefore, it is necessary to remove this socket
    //from the registered clients list
    status = this->ReceivePrivate(*it);
    if (status == IGTL_STATUS_NOT_PRESENT)
    {
      //remember this socket for later, it is not a good idea to remove it
      //from the list directly because we iterate over the list at this point
      socketsToBeRemoved.push_back(*it);
      MITK_WARN("IGTLServer") << "Lost connection to a client socket. ";
    }
    else if (status != 1)
    {
      MITK_WARN("IGTLServer") << "IGTL Message with status: " << status;
    }
  }
  m_ReceiveListMutex->Unlock();
  if (socketsToBeRemoved.size() > 0)
  {
    //remove the sockets that are not connected anymore
    this->StopCommunicationWithSocket(socketsToBeRemoved);
    //inform observers about loosing the connection to these sockets
    this->InvokeEvent(LostConnectionEvent());
  }
}