locked
Синхронный вариант TCP сокетов в WinRT RRS feed

  • Вопрос

  • Доброго времени суток!

    У меня задача - сделать синхронный вариант Tcp socket.

    Я написал класс обёртку вокруг Windows::Networking::Sockets::StreamSocket, но она получилась очень громоздкой, и, как оказалось, очень тормозной:

    SyncSocketWrapper::SyncSocketWrapper(Windows::Networking::Sockets::StreamSocket^ socket) : m_socket(socket), m_dataReader(ref new DataReader(m_socket->InputStream)), m_dataWriter(ref new DataWriter(m_socket->OutputStream)) { m_dataReader->InputStreamOptions = InputStreamOptions::Partial; } // ... size_t SyncSocketWrapper::read(void *buffer, size_t len) { try { auto loadOp = m_dataReader->LoadAsync(len); MyStringWrapper errMess; unsigned int result = 0; bool success = false; loadOp->Completed = ref new AsyncOperationCompletedHandler<UINT> ([&](IAsyncOperation<UINT>^ operation, AsyncStatus status) { try { result = operation->GetResults(); m_dataReader->ReadBytes(Platform::ArrayReference<uint8>((unsigned char *)buffer, result)); success = true; } catch (Platform::Exception^ e) { errMess.setString(e->Message->Data()); } catch (...) { errMess.setString(_T("Unknown winrt socket exception")); } m_readEvent.notify(); }); m_readEvent.waitForEvent(); if (!success) { throw somemyspacename::util::Exception(errMess.getString()); } return result; } catch (Platform::Exception^ e) { throw somemyspacename::util::Exception(e->Message->Data()); } }

    // ...

    Есть ли более изящный способ получить синхронные операции чтения/записи  TCP сокетов?

    Самый идеальный вариант для меня - это наличие синхронных вариантов в API, которые я упустил из виду :)

    Если у кого есть информация, прошу поделиться.

    24 декабря 2012 г. 8:33

Ответы

  • Привет.

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

    Попробуйте применить Task Parallelism (Concurrency Runtime) из библиотеки PPL


    Для связи [mail]

    • Помечено в качестве ответа Sevastyanov Yuri 26 декабря 2012 г. 17:05
    25 декабря 2012 г. 9:45

Все ответы

  • Привет.

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

    Попробуйте применить Task Parallelism (Concurrency Runtime) из библиотеки PPL


    Для связи [mail]

    • Помечено в качестве ответа Sevastyanov Yuri 26 декабря 2012 г. 17:05
    25 декабря 2012 г. 9:45
  • Привет.

    Спасибо за совет.

    В моём случае вообще нет никакой привязки к UI thread. Все операции чтения/записи выполняются в своём потоке.

    Я и интересовался синхронными операциями, потому что считаю некрасивым такой подход, когда на каждую операцию чтения записи нужен свой task. Слишком "мелкие" таски получаются.

    Я правильно Вас понял, что использование асинхронных операций это "категорическая" обязаловка?

    25 декабря 2012 г. 10:30
  • Да, выполнение функций спроектировано и реализовано асинхронно. От этого не уйти.


    Для связи [mail]

    26 декабря 2012 г. 15:11
  • В C# появились волшебные слова async/await. Код остается асинхронным, но выглядит как синхронный. В C++ их аналога нет?

    9 января 2013 г. 9:27