god4mir2
驱动牛犊
驱动牛犊
  • 注册日期2010-07-07
  • 最后登录2011-07-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2320回复:2

求助,TDI网络传输编程的问题

楼主#
更多 发布于:2010-12-13 17:36
在驱动下通过tdi连接http服务器下载数据,用的是httpdisk的封装好的socket函数,遇到如下问题:

1,如果每次下载创建一个新的socket连接,那么当下载频率过快的时候,新创建的socket连接失败,报错说是网络上已经存在同名,但是等待一会后再连接就好,大概几十秒。
连接报错为:STATUS_ADDRESS_ALREADY_EXISTS
如果将TDI_DISCONNECT_RELEASE换成TDI_DISCONNECT_ABORT,IoCallDriver后就返回PENDING一直等待,电脑近乎死机。

2,如果每次下载都用同一个连接,也就是只创建一个socket连接后不断开,那么当很久不下载后,大约几十秒,再次下载就会很慢,要等待几十秒才开始有反应。

真诚请高手帮忙分析下问题。tdi编程也没找到什么好资料,不如应用层的socket好用阿。
god4mir2
驱动牛犊
驱动牛犊
  • 注册日期2010-07-07
  • 最后登录2011-07-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-02-23 10:57
自己顶,盼高手指点。
god4mir2
驱动牛犊
驱动牛犊
  • 注册日期2010-07-07
  • 最后登录2011-07-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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到底有什么区别和影响。

游客

返回顶部