Решение состоит в том, чтобы использовать два независимых BufferedStream
с, один для получения и один для отправки. И не забудьте очистить отправку BufferedStream
соответствующим образом.
Поскольку даже в 2018 году, кажется, трудно получить удовлетворительный ответ на этот вопрос, ради человечества, вот мои два цента:
NetworkStream
является буферизованным на стороне ОС Однако это не означает, что нет причин для буферизации на стороне .net. TCP работает хорошо при записи-чтении (повтор), но останавливается при записи-записи-чтении из-за задержки подтверждения и т. Д. И т. Д.
Если у вас, как и у меня, есть куча кодов протоколов, не соответствующих стандартам XXI века, вы должны создать буфер.
В качестве альтернативы , если вы придерживаетесь вышеупомянутого, вы также можете буферизовать только чтение / rcvs или только запись / отправку, и использовать NetworkStream
напрямую для другой стороны, в зависимости от того, какой код нарушен является. Вы просто должны быть последовательными!
То, что BufferedStream
документы не дают полной ясности, заключается в том, что вы должны переключать чтение и запись только в том случае, если ваш поток доступен для поиска . Это потому, что он буферизует чтения и записи в одном и том же буфере. BufferedStream
просто не работает для NetworkStream
.
Как отметил Марк, причиной этой хромоты является слияние двух потоков в один NetworkStream, что не является одним из величайших проектных решений .net.