2016-04-04 3 views
0

У меня есть 2 программы. 1 сервер и 1 клиент.Что происходит, когда мы делаем networkstream.write()?

В клиенте это звучит примерно так:

while(statement) 
{ 
    networkstream.write(data); 
} 

И на сервере он идет что-то вроде этого:

while(statement) 
{ 
    while(statement) 
    { 
     ReceiveData; 
    } 

    Do other stuff; 
} 

Таким образом, в то время как клиент может написать в поток сети очень быстро , сервер все еще должен следить за данными, прежде чем он сможет прочитать еще несколько.

Что происходит, когда клиент уже сделал 4 круга цикла, содержащих запись, в то время как сервер все еще читает только 1 раз, например.

Есть ли способ сообщить клиенту, когда он сможет написать еще одну запись? А также, что происходит, когда клиент делает несколько «.write»? сервер хранит их все и читает их все, или данные, которые были отправлены, перезаписываются?

Надеюсь, вы сможете понять мой вопрос. Измените заголовок вопроса, если хотите.

+1

networkstream.Write является синхронным. Он ожидает, пока данные будут отправлены. networkstream.WriteAsync - нет. Какой из них вы используете? У обоих есть механики, чтобы обеспечить достаточную запись/чтение. – ntohl

+0

Прямо сейчас у меня есть это так: 'networkstream.Write (SendingBuffer, 0, currentPacketLength);' – meme

+0

http://stackoverflow.com/questions/1611582/how-does-networkstream которые должны помочь – ntohl

ответ

3

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

Чтобы ответить на ваш вопрос, где-то вдоль линии будет буфер (кусок памяти), в который записываются ваши байты. Пока они не будут отправлены на следующую остановку по пути, она будет блокироваться (ждать/висеть ...). Эти вызовы будут перемещаться вниз по стеку, вверх на принимающей стороне, а затем вниз по другую сторону и снова вверх. Поэтому, когда возвращается ваш write, вы можете быть уверены, что все будет хорошо, если вы не вернете код ошибки, исключение или, тем не менее, ваша обработка ошибок работает.

Если сервер работает медленно при обработке ваших запросов, он не достигнет read так быстро, как вам хотелось бы, поэтому буферы между вами и ними будут заполняться, после чего запись прекращается.

Существует множество различных буферов на разных слоях, полный ответ будет довольно сложным. https://en.wikipedia.org/wiki/OSI_model

Смежные вопросы