阅读:2363回复:2
求助,TDI网络传输编程的问题
在驱动下通过tdi连接http服务器下载数据,用的是httpdisk的封装好的socket函数,遇到如下问题:
1,如果每次下载创建一个新的socket连接,那么当下载频率过快的时候,新创建的socket连接失败,报错说是网络上已经存在同名,但是等待一会后再连接就好,大概几十秒。 连接报错为:STATUS_ADDRESS_ALREADY_EXISTS 如果将TDI_DISCONNECT_RELEASE换成TDI_DISCONNECT_ABORT,IoCallDriver后就返回PENDING一直等待,电脑近乎死机。 2,如果每次下载都用同一个连接,也就是只创建一个socket连接后不断开,那么当很久不下载后,大约几十秒,再次下载就会很慢,要等待几十秒才开始有反应。 真诚请高手帮忙分析下问题。tdi编程也没找到什么好资料,不如应用层的socket好用阿。 |
|
沙发#
发布于:2011-02-23 10:57
自己顶,盼高手指点。
|
|
板凳#
发布于:2011-05-09 19:57
第一种情况终于解决了,httpdisk的ksocket代码有bug。第二种情况怀疑和连接超时有关系。
按照http://bbs.driverdevelop.com/read.php?tid-106525.html这篇的文章把TDI_DISCONNECT_RELEASE换成TDI_DISCONNECT_ABORT在重复连接时就不会出现STATUS_ADDRESS_ALREADY_EXISTS错误了。 但是httpdisk的ksocket代码会出现死等。在tdi_disconnect中有 KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, 0); 在外面有 KeWaitForSingleObject(&s->streamSocket->disconnectEvent, Executive, KernelMode, FALSE, NULL); 外面会出现死等,回调函数不调用 NTSTATUS event_disconnect(PVOID TdiEventContext, CONNECTION_CONTEXT ConnectionContext, LONG DisconnectDataLength, PVOID DisconnectData, LONG DisconnectInformationLength, PVOID DisconnectInformation, ULONG DisconnectFlags) { PSOCKET s = (PSOCKET) TdiEventContext; PSTREAM_SOCKET streamSocket = (PSTREAM_SOCKET) ConnectionContext; KeSetEvent(&streamSocket->disconnectEvent, 0, FALSE); return STATUS_SUCCESS; } 而且这个回调函数好像有bug,s没用上,明天再细看。 同时不明白TDI_DISCONNECT_ABORT和TDI_DISCONNECT_RELEASE到底有什么区别和影响。 |
|