Когда BeginRecieve TCP-сокета запускает делегат onDataReceived, что происходит с последующими пакетами, полученными до повторного вызова BeginReceive? - PullRequest
0 голосов
/ 08 июля 2011

Другими словами, что происходит с новыми пакетами, полученными между началом выполнения делегата:

public static void Read_Callback(IAsyncResult ar){ 
    StateObject so = (StateObject) ar.AsyncState; 
    Socket s = so.workSocket;

    int read = s.EndReceive(ar);

    if (read > 0) {
            so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read));

и следующий следующий вызов beginReceive для этого сокета?

            s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                 new AsyncCallback(Async_Send_Receive.Read_Callback), so);
}

Параллельно выполняется второй onDataReceived или очередь данных помещается в буфер, а следующий метод beginReceive запускает делегат сразу после вызова?

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Данные помещаются в очередь в буфер. Эти обратные вызовы выполняются в пуле потоков, поэтому, как только вызывается BeginReceive, может быть выполнен обратный вызов.

0 голосов
/ 08 июля 2011

Вы должны явным образом вызывать BeginReceive, однако делать это не следует, пока обратный вызов не завершится. См. http://msdn.microsoft.com/en-us/library/bew39x2a.aspx#Y53 для правильного примера. Что касается более общего вопроса tcp, я полагаю, что это зависит от реализации стека tcp, но, безусловно, существует буфер, в котором данные накапливаются на более низком уровне. В зависимости от настроек отправителя, он может блокироваться при заполнении буфера, если никто на стороне получателя не вызывает правильный метод приема в сокете. Надеюсь, это поможет.

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