0

我的应用程序可以在串行和套接字连接之间切换,但不能同时打开。因此,当我尝试在 Socket 和 Serial 之间切换时,我删除了 Socket 连接。

基于套接字的对象使用一个名为 UsesWinsock 的私有类(在这里向Len Holgate大声喊叫,因为它基本上是他的代码(实际上是 RAII,但我从未将它应用于 WSA,直到我看到他这样做))。这只是调用 WSAStart 和 WSACleanUp。

当 WSACleanUp 被调用时,它会进入 NTDLL 和汇编程序。@err,hr 给我“传递给系统调用的数据区域太小”作为 HRESULT。

我尝试过移动代码:按照继承顺序移动类会导致破坏序列发生变化,并且实际上破坏了函数,因此它们是破坏序列中最后被调用的东西。都没有奏效。

我很确定我已经释放了所有分配的东西(只有 1 个套接字和几个事件)并且我被卡住了 - 这对我来说是一个相当重要的问题。

谷歌返回 4 个结果没有帮助解决我的问题

有什么建议么?

4

2 回答 2

1

那么,您是否按原样使用我的 UsesWinsock 类?也就是说,你是说它坏了吗?如果是这样,直接给我发电子邮件可能是解决问题的更有效方法;)

我注意到我的代码实际上并没有检查 dtor 中 WSACleanUp() 的返回码,所以,我假设您正在检查它,它是 SOCKET-ERROR 并且 WSAGetLastError() 正在报告 ERROR-INSUFFICIENT-BUFFER ?

于 2009-02-16T11:17:22.347 回答
0

如果您在 Windows 调试器中使用 wt“跟踪和监视数据”命令,我很想知道您会发现什么:

在 WSACleanup 的开头设置断点:

bp ws2_32!wsacleanup

一旦命中,发出跟踪命令:

重量 -oa -oR @$ra

并注意对 ntdll!RtlSetLastWin32Error 的调用

你也可以在这里发布调查结果,看看它们会很有趣。

于 2009-02-17T19:26:56.250 回答