2014-04-10 148 views
0

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

每过一段时间,我都会遇到一些问题,即数据发生错误或缺少块(尚未确切确认它是哪个)。例如,有一次我收到看起来像这样

Slice Id="0" layotartX='100' 

一些腐败的数据称为layotartX并不在我的数据中存在的属性,它应该说布局= ...而是布局得到切断,其他数据会在后面追加。我对字节进行了计数,并注意到它在正好是我的缓冲区大小的256字节处被截断。很有可能增加我的缓冲区大小可以防止发生这种问题(数据乱序发生?)。无论如何,正如第1段所述,我只是问是否有任何理由,我不应该增加缓冲区大小,如5,000字节甚至10,000字节。

添加一些代码。下面是我修改的ReceiveCallback函数(请参阅上面关于其余类的链接示例代码。当ReceiveCallback接收数据时,它会调用我在下面发布的“ReceiveSomeData”函数。由于某种原因,每隔一段时间“ReceiveSomeData”函数在一个名为“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; 
     } 
    } 

回答

1

是的,你绝对应该增加缓冲区大小的东西更接近你期望在一个读得到什么。32K或64K会是大多数用途的不错选择话虽如此,如果您使用的是TCP/IP套接字,数据将不会进入“乱序”或“丢失块”状态;如果你看到类似的东西,这是你的代码中的错误,而不是套接字中的错误。如果您需要帮助,请分享您的代码。

+0

添加了一些示例代码。谢谢。 – LampShade

+0

嗨EricLaw,如果你有时间,请你看看我的另一篇文章,关于数据乱序。我能够更好地重现我的问题。它位于这里http://stackoverflow.com/questions/23137246/asynchronous-client-socket-receive-buffer-data-out-of-order – LampShade