如何检查数据是否已上传(目标已接收到数据)

时间:2018-12-02 15:36:13

标签: c# wpf sockets tcp networkstream

我有一个问题,当我使用NetworkStream.BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)方法时,在真正上传数据之前调用了回调,我认为由于Nagle算法,数据已插入等待发送的队列中。

有什么办法知道数据是否上传完毕,然后执行一些操作或发送其余数据?

在数据上传后(目标已接收到数据),并且在发送其他数据之前,我需要执行一些操作。

谢谢。

发送数据

if (m_PendingSend)
{
    var idB = BitConverter.GetBytes(id);
    Array.Copy(idB, 0, bData2, bData.Length - 8, idB.Length);
    if (isFile)
        m_SendQueue.Add(bData2);
    else
        m_SendQueue.Insert(0, bData2);
    }
    else
    {
    m_PendingSend = true;
    try
    {
        m_NetworkStream.BeginWrite(bData2, 0, bData2.Length - 8, new AsyncCallback(EndSend), id);
    }
    catch (Exception e)
    {
        e.Log();
        Disconnect();
    }
}

回叫

private void EndSend(IAsyncResult ar)
{
    lock (this)
    {
        try
        {
            m_NetworkStream.EndWrite(ar);
            if (m_SendQueue.Count > 0)
            {
                byte[] bData = m_SendQueue[0];
                var id = BitConverter.ToInt64(bData, bData.Length - 8);
                m_SendQueue.RemoveAt(0);
                m_NetworkStream.BeginWrite(bData, 0, bData.Length - 8, new AsyncCallback(EndSend), id);
            }
            else
            {
                m_PendingSend = false;
            }
            OnEndWrite?.Invoke((long)ar.AsyncState);
        }
        catch (Exception ex)
        {
            ex.Log();
            Disconnect();
        }
    }
}

0 个答案:

没有答案