【问题标题】:maximum data read through socket通过套接字读取的最大数据
【发布时间】:2017-12-10 12:01:26
【问题描述】:

我有一个从套接字读取数据的函数。

public int getResp(byte[] Buff, ref int rxBytes)//Buff is byte array of length 150000 bytes
        {          
            while (socet.Available < rxBytes)//rxBytes = 150000
            {
                int socketAvaildata = socet.Available;
                Thread.Sleep(1000);
                if (socketAvaildata == socet.Available)
                    break;
            }
            try
            {
                //Thread.Sleep(100);
                rxBytes = socet.Available;           
                if (rxBytes > 0)
                {
                    socet.Receive(Buff, rxBytes, 0);
                    return rxBytes;
                }
            }
            catch (Exception ex) 
            {

            }
            return -1;
        }

这个函数在我们要读取小数据的时候很好用,但是当我们要读取大数据(超过100000字节)时,它只返回一部分数据。在 dubug 模式下,当 socet.Available = 65536 时,我检查了控制到达 break 。 那么它是我们可以阅读的最大限制还是我做错了什么?

【问题讨论】:

    标签: c# sockets networking


    【解决方案1】:

    Receive 方法返回实际接收的字节数。所以只需将该位更改为:

    rxBytes = socet.Receive(Buff, rxBytes, 0);
    return rxBytes;
    

    请注意,rxBytes 可能小于您最初请求的字节数。为确保您已准确读取该字节数,请使用:

    public bool TryReadResponse(byte[] buffer, int expectedNumberOfBytes)
    {
        try
        {
            int remaining = expectedNumberOfBytes;
            int offset = 0;
            while (remaining > 0)
            {
                int read = socet.Receive(buffer, offset, remaining, SocketFlags.None);
                if (read == 0)
                {
                    // other side has closed the connection before sending the requested number of bytes
                    return false;
                }
    
                offset += read;
                remaining -= read;
            }
    
            return true;
        }
        catch (Exception ex)
        {
            // failure
            return false;
        }
    }
    

    我冒昧地从参数中删除了ref,因为您只关心操作是否完全成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      相关资源
      最近更新 更多