supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)
接收過濾器(ReceiveFilter)用于將接收到的二進制數據轉化成請求實例(RequestInfo)。
實現一個接收過濾器(ReceiveFilter), 你需要實現接口 IReceiveFilter:
public interface IReceiveFilter
where TRequestInfo : IRequestInfo
{
///
/// Filters received data of the specific session into request info.
///
/// 待讀取的緩沖數據.
/// 這個待讀取緩沖中當前接收數據的偏移量
/// 當前接收數據的長度
/// if set to true [to be copied].
/// 沒有被解析的數據的長度
///
TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest);
///
/// Gets the size of the left buffer.
///
///
/// 接收過濾器已緩存數據的長度
///
int LeftBufferSize { get; }
///
/// Gets the next receive filter.
///
IReceiveFilter NextReceiveFilter { get; }
///
/// Resets this instance to initial state.重置這個實例到初始化狀態
///
void Reset();
}
TRequestInfo: 類型參數 "TRequestInfo" 是你要在程序中使用的請求類型(RequestInfo);
LeftBufferSize: 該接收過濾器已緩存數據的長度;
NextReceiveFilter: 當下一塊數據收到時,用于處理數據的接收過濾器實例;
Reset(): 重設接收過濾器實例到初始狀態;
Filter(....): 該方法將會在 SuperSocket 收到一塊二進制數據時被執行,接收到的數據在 readBuffer 中從 offset 開始, 長度為 length 的部分。
TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest);
readBuffer: 接收緩沖區, 接收到的數據存放在此數組里
offset: 接收到的數據在接收緩沖區的起始位置
length: 本輪接收到的數據的長度
toBeCopied: 表示當你想緩存接收到的數據時,是否需要為接收到的數據重新創建一個備份而不是直接使用接收緩沖區
rest: 這是一個輸出參數, 它應該被設置為當解析到一個為正的請求后,接收緩沖區還剩余多少數據未被解析
這兒有很多種情況需要你處理:
當你在接收緩沖區中找到一條完整的請求時,你必須返回一個你的請求類型的實例.
當你在接收緩沖區中沒有找到一個完整的請求時, 你需要返回 NULL.
當你在接收緩沖區中找到一條完整的請求, 但接收到的數據并不僅僅包含一個請求時,設置剩余數據的長度到輸出變量 "rest". SuperSocket 將會檢查這個輸出參數 "rest", 如果它大于 0, 此 Filter 方法 將會被再次執行, 參數 "offset" 和 "length" 會被調整為合適的值.
總結
以上是生活随笔為你收集整理的supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冻干面膜用7A抗菌铂可拉膜布真的能解决细
- 下一篇: 临县5.8号火灾马累平什么情况了?