WSACleanUp导致异常

时间:2009-02-16 10:59:27

标签: c++ sockets wsastartup windows-socket-api wsacleanup

我的应用可以在串口和套接字连接之间切换,但两者都不能同时打开。所以当我尝试在Socket到Serial之间切换时,我删除了Socket连接。

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

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

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

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

Google is unhelpful returning 4 results of which none solve my problem

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

在WSACleanup的开头设置一个断点:

bp ws2_32!wsacleanup

点击后,发出trace命令:

wt -oa -oR @$ra

并注意对ntdll的调用!RtlSetLastWin32Error

你也可以在这里发表调查结果,看看它们很有意思。