Если вы используете отдельные потоки, вы не сможете читать из канала одновременно с записью в него. Например, если вы выполняете блокирующее чтение из канала, то последует блокирующая запись (из другого потока), тогда вызов записи будет ждать / блокировать до завершения вызова чтения, а во многих случаях, если это непредвиденное поведение, ваша программа будет заблокироваться.
Я не тестировал перекрывающийся ввод-вывод, но он МОЖЕТ решить эту проблему. Однако, если вы решили использовать синхронные вызовы, то следующие модели могут помочь вам решить проблему.
Master / Slave
Вы можете реализовать модель «ведущий / ведомый», в которой клиент или сервер является ведущим, а другой конец отвечает только тем, что обычно вы найдете в примерах MSDN.
В некоторых случаях это может оказаться проблематичным в том случае, если ведомому устройству периодически требуется отправлять данные ведущему устройству. Вы должны либо использовать внешний механизм сигнализации (вне канала), либо мастер периодически запрашивать / опрашивать подчиненного, либо вы можете поменяться ролями, где клиент является главным, а сервер - подчиненным.
Writer / Reader
Вы можете использовать модель писателя / читателя, в которой вы используете два разных канала. Однако вы должны как-то связать эти два канала, если у вас несколько клиентов, так как каждый канал будет иметь разный дескриптор. Это можно сделать, отправив клиенту уникальное значение идентификатора при подключении к каждому каналу, что позволит серверу связать эти два канала. Это число может быть текущим системным временем или даже уникальным идентификатором, который является глобальным или локальным.
Тема
Если вы решили использовать синхронный API, вы можете использовать потоки с моделью master / slave, если вы не хотите, чтобы вас блокировали во время ожидания сообщения на стороне slave. Однако вы захотите заблокировать считыватель после того, как он прочитает сообщение (или встретит конец серии сообщений), затем напишет ответ (как должен ведомый) и, наконец, разблокирует считыватель. Вы можете заблокировать и разблокировать считыватель, используя блокирующие механизмы, которые переводят нить в спящий режим, поскольку они будут наиболее эффективными.
Проблема безопасности с TCP
Потеря при использовании TCP вместо именованных каналов также является самой большой возможной проблемой. Поток TCP изначально не содержит никакой защиты. Поэтому, если безопасность является проблемой, вам придется реализовать это, и у вас есть возможность создать дыру в безопасности, так как вам придется обрабатывать аутентификацию самостоятельно. Именованный канал может обеспечить безопасность, если вы правильно установите параметры. Кроме того, еще раз отметим более четко: безопасность - это непростое дело, и в общем случае вы захотите использовать существующие средства, разработанные для ее обеспечения.