阅读:1575回复:6
Tdi driver的问题
最近在写Tdi driver遇到了一个问题,请大伙帮忙看看。
在ClientEventReceive handler 里面如果TDI_RECEIVE_ENTIRE_MESSAGE 被clear了(RECEIVE_PARTIAL is set),怎么能得到这个full TSDU一共多少数据呢? BytesAvailable这个数值好像不对。 |
|
沙发#
发布于:2003-12-25 13:51
我是这样写的
if( ReceiveFlags & TDI_RECEIVE_ENTIRE_MESSAGE )// 数据全部在TSDU里面 { *BytesTaken = BytesAvailable; TcpFillSocketReceiveBuffer( pSession,Tsdu, BytesAvailable); // 填充Socket数据区 TcpFillDeviceReceiveBuffer( pSession ); // 分析数据包 } else // ---------- 这个包还不是最后一部分 ----------- { *BytesTaken = BytesIndicated; TcpFillSocketReceiveBuffer( pSession,Tsdu, BytesIndicated); // 填充Socket数据区 } |
|
板凳#
发布于:2003-12-25 14:07
没有完全理解你的意思,你是不是说每次把byteindicated的数据取走,bytetaken=byteindicated?,但是应该return什么status呢?
|
|
地板#
发布于:2003-12-25 14:14
自己做一个接收缓冲区,等把包全部接收下来再处理.因为Socket会拆包的.
|
|
地下室#
发布于:2003-12-25 14:20
可是我现在是在kernel mode,没有socket啊,而且按照你的程序,如果TDI_RECEIVE_ENTIRE_MESSAGE clear了每次只receive byteindicated 的数据,然后是不是return呢,然后ClientEventReceive被再调用?如果是这样那么返回的status是什么呢?
|
|
5楼#
发布于:2003-12-25 14:26
当然要马上return STATUS_SUCCESS;
ClientEventReceive()会再次调用的.*BytesTaken 一定要赋值,否则不再调用了. 一定要注意此时在DISPATCH_LEVEL上 |
|
6楼#
发布于:2003-12-25 14:42
ok,
I will try it.Thank you very much. :D |
|