当TCP套接字的BeginRecieve触发onDataReceived委托时,在再次调用BeginReceive之前收到的后续数据包会发生什么?

时间:2011-07-08 16:12:30

标签: .net sockets

换句话说,在开始执行委托之间收到的新数据包会发生什么:

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 个答案:

答案 0 :(得分:1)

数据排队到缓冲区。这些回调在线程池上执行,因此只要调用BeginReceive,就可以触发回调。

答案 1 :(得分:0)

你必须明确地调用BeginReceive,但是在回调完成之前你不应该这样做。有关正确的示例,请参阅:http://msdn.microsoft.com/en-us/library/bew39x2a.aspx#Y53。 至于更一般的tcp问题,我认为它取决于tcp堆栈实现,但肯定有一个缓冲区,其中数据在较低级别累积。根据发送方的设置,如果接收方没有人在套接字上调用正确的接收方法,它可能会阻塞缓冲区已满。希望这会有所帮助。