繁体   English   中英

.NET Socket.BeginReceive:读取的字节数

[英].NET Socket.BeginReceive: number of bytes read

出于好奇,我一直在这里查看数据包捕获代码。 有这样的部分:

private void OnReceive(IAsyncResult ar)
{
    try
    {
        int nReceived = mainSocket.EndReceive(ar);

        //Analyze the bytes received...

        ParseData (byteData, nReceived);

        if (bContinueCapturing)     
        {
            byteData = new byte[4096];

             //Another call to BeginReceive so that we continue to receive the incoming
             /packets
             mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
             new AsyncCallback(OnReceive), null);
        }
    }
    ...
    ...
}

MSDN文档说,EndReceive确实返回了接收到的字节数,但是在每次异步接收之后简单地连续累加nReceived并不会达到我期望的字节数。 例如,下载16 MB的文件仅达到约200K。

我看了其他与此类似的问题却没有发现任何问题。 我尝试更改缓冲区大小以查看是否有所不同,但没有。 我只是误解了代码的作用吗?

编辑 :接收到的字节正在累积这样。 看起来很简单,所以希望我没有在这里犯错误!

long totalBytes = 0;
Object byteLock = new Object();
private void ParseData(byte[] byteData, int nReceived)
{
    lock (byteLock)
    {
        totalBytes += nReceived;                
    }
}

Edit2 :这是用于接收数据的代码。 如果需要更多详细信息,可以从我的问题开头的链接中获取完整的源代码。 该文件是MJsnifferForm.cs。

private void OnReceive(IAsyncResult ar)
{
    try
    {
        int nReceived = mainSocket.EndReceive(ar);

        //Analyze the bytes received...

        ParseData (byteData, nReceived);
        if (bContinueCapturing)     
        {
            byteData = new byte[4096];

            //Another call to BeginReceive so that we continue to receive the incoming
            //packets
            mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
                 new AsyncCallback(OnReceive), null);
        }
    }
    catch (ObjectDisposedException)
    {
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "MJsniffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }            
}

我想知道在调用“ mainSocket.EndReceive”和下一个调用“ mainSocket.BeginReceive”之间是否可能会丢失接收,但是我不认为这应该成为问题吗?

对于遇到此问题的任何人回答我自己的问题:我的问题是防火墙无声阻止。 为程序添加例外(包括VS Studio调试可执行文件,即MJSniff.vshost.exe)可以查看传入的流量。 我的经验教训:这并不总是代码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM