Где хранится сетевой поток - PullRequest
0 голосов
/ 21 января 2019

Я новичок в программировании и особенно в мире сетей До сих пор я узнал кое-что о программировании tcp, sync и async и более или менее понимаю, как идут дела (я даже написал простую программу клиент-сервер) Но есть еще несколько вопросов, на которые я не смог найти ответ. 1. Если я (клиент) записываю в сетевой поток (на сервер), но сервер не читает поток, пока я не выполню какую-либо команду. Что происходит с этими битами? Хранятся ли они где-нибудь на стороне сервера, пока они не будут прочитаны? 2. Когда я читаю «поток» с помощью команды stream.read (c #) Где я на самом деле читаю?

Было бы неплохо быть направленным на соответствующие материалы для чтения Я думаю, что vit также поможет мне понять больше асинхронного программирования

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 января 2019
  1. Если я (клиент) записываю в сетевой поток (на сервер), но сервер не читает поток, пока я не выполню какую-либо команду.Что происходит с этими битами?

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

После того, как данные отправлены клиентом и получены на сервере, онисобрал, собрал и проверил в ядре серверной ОС.Если все в порядке, данные будут ждать в очереди ввода, пока вы не прочитаете их.

Они хранятся где-то на стороне сервера, пока не будут прочитаны?

Итакда, ваше понимание верно.

Когда я читаю «поток» с помощью команды stream.read (c #) Откуда я на самом деле читаю?

Я не знаю особенностей C #, но позвольте мне изложить этотаким образом - на этом уровне абстракции данные всегда читаются из ядра;из куска памяти принимающего компьютера.Функция может ожидать появления данных (опционально, позволяя другим задачам выполняться в это время).Я не ожидал бы ничего низкого уровня здесь.Я также не удивлюсь, если ваш потоковый считыватель может буферизовать данные или передавать их порциями (например, методом readline), но опять же - я не знаю особенностей C #.

0 голосов
/ 21 января 2019

Некоторая документация, связанная с классом NetworkStream:

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.networkstream?view=netframework-4.7.2

Кроме того, TCP обеспечивает отслеживание отправленных пакетов с проверкой, были ли отправленные пакеты получены. В отличие от UDP, где нет проверки, были ли отправлены отправленные пакеты. https://www.howtogeek.com/190014/htg-explains-what-is-the-difference-between-tcp-and-udp/

Так что это зависит от того, будет ли это TCP или UDP в этом случае.

Кроме того, разница между, например, FileStream и NetworkStream в вашем случае заключается в том, что FileStream использует файл как способ хранения информации (обычно на жестком диске), где другое приложение может читать ее в любое время, в то время как NetworkStream требует, чтобы оба приложения, имеющие соединение, были активными в одно и то же время, потому что информация обычно отправляется / принимается по кабелю. По умолчанию он не имеет постоянной формы хранения.

EDIT: Stream.Read, вероятно, блокирующая функция, которая прослушивает порт, пока не решит прекратить прослушивание. Сервер должен прослушивать (с помощью Stream.Read), прежде чем он сможет получать информацию. В случае TCP сервер и клиент должны сначала выполнить трехстороннее рукопожатие, прежде чем они смогут обмениваться информацией. https://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...