异步客户端套接字,增加缓冲区大小



我已经实现了一个与本例极其相似的异步客户端套接字。为什么我不能显著增加这个缓冲区的大小?在这个例子中,缓冲区的大小是256字节。在许多的情况下,我的应用程序最终接收到的数据是5000++字节的数据。我应该增加缓冲区大小吗?有什么理由不应该增加缓冲区大小吗?

每隔很长一段时间,我就会遇到一些问题,比如数据出现故障或区块丢失(具体是哪一个尚待确认)。例如,有一次我收到一些损坏的数据,看起来像这个

Slice Id="0" layotartX='100'

在我的数据中不存在名为laystartX的属性,它应该说layout=。。。但是布局被截断了,其他数据随后被附加到它上面。我数了数字节,注意到它被截断为256字节,恰好是我的缓冲区大小。增加我的缓冲区大小很可能会防止这个问题的发生(数据无序??)。无论如何,正如第一段所述,我只是想问是否有任何理由不应该将缓冲区大小增加到5000字节甚至10000字节。

添加一些代码下面是我修改后的ReceiveCallback函数(其他类请参阅上面链接的示例代码。当ReceiveCallback接收到数据时,它会调用我在下面发布的"ReceiveSomeData"函数。由于某些原因,我每隔一段时间就会出现数据无序或丢失的情况。"ReceiveSome data"函数位于一个名为"MyChitterChatter"的类中"ReceiveCallback"函数位于名为"AsyncClient"的类中。因此,当您看到ReceiveSomeData函数锁定"this"时,它就是锁定MyChitterChatter类。有没有我的问题可以通过撒谎?

    private static void ReceiveCallback( IAsyncResult ar )
    {
        AppDelegate appDel = (AppDelegate)UIApplication.SharedApplication.Delegate;
        try {
            // Retrieve the state object and the client socket 
            // from the asynchronous state object.
            StateObject state = (StateObject) ar.AsyncState;
            Socket client = state.workSocket;
            // Read data from the remote device.
            int bytesRead = client.EndReceive(ar);
            if (bytesRead > 0) {
                // There might be more data, so store the data received so far.
                string stuffWeReceived = Encoding.ASCII.GetString(state.buffer,0,bytesRead);
                string debugString = "~~~~~ReceiveCallback~~~~~~ " + stuffWeReceived + " len = " + stuffWeReceived.Length + " bytesRead = " + bytesRead;
                Console.WriteLine(debugString);

                // Send this data to be received
                appDel.wallInteractionScreen.ChitterChatter.ReceiveSomeData(stuffWeReceived);
                // Get the rest of the data.
                client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
                    new AsyncCallback(ReceiveCallback), state);
            } else {
                // Signal that all bytes have been received.
                receiveDone.Set();
            }
        } 
        catch (Exception e) {
            Console.WriteLine("Error in AsyncClient ReceiveCallback: ");
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }
    }

    public void ReceiveSomeData ( string data )
    {
        lock(this)
        {
            DataList_New.Add(data);
            // Update the keepalive when we receive ANY data at all
            IsConnected = true;
            LastDateTime_KeepAliveReceived = DateTime.Now;
        }
    }

是的,您绝对应该将缓冲区大小增加到更接近您在一次读取中所期望的大小。32k或64k对于大多数用途来说都是不错的选择。

话虽如此,如果您使用TCP/IP套接字,数据永远不会"无序"或"丢失大块";如果你看到这样的东西,那是你代码中的错误,而不是套接字中的错误。如果您需要帮助,请共享您的代码。

最新更新