在DLL中捕获未处理的异常

时间:2015-12-07 14:37:19

标签: c++ debugging dll winsock sendto

我在.dll项目中使用Visual Studio Express 2013编写C ++套接字代码。我正处于这个sendto函数出错的地方:

/* Send data back */
            if (sendto(sd, (const char *)sendBuffer,(int)sizeof(sendBuffer), 0,
                (struct sockaddr *)&client, sizeof(client)) ==
                SOCKET_ERROR)
            {
                err = WSAGetLastError();
                closesocket(sd);
                WSACleanup(); 
                throw std::runtime_error("Error sending datagram.");


            }

我知道我们可以使用WSAGetLastError()获取错误代码,但是如果我将其初始化为变量,我似乎只能得到垃圾数字。如何解除sendto错误?我编写了单元测试来测试这个dll,但我不确定是否有办法可以打印出错误。

编辑:所以在将条件更改为== not!=它不再在sendto失败但现在失败

bytes_received = recvfrom(sd, readBuffer, NTP_PACKET_MAX, 0, (struct sockaddr *)&client, &len);

            if (bytes_received == SOCKET_ERROR)
            {
                err = WSAGetLastError(); 
                closesocket(sd);
                WSACleanup();
                throw std::runtime_error("Could not receive datagram.");
            }

与原始问题一样,我不确定如何获得正确的错误。在调试recvfrom函数时,我将鼠标悬停在err上,它表示它保存的值是114351196.从我所看到的,这不是一个有效的Windows套接字错误代码。

1 个答案:

答案 0 :(得分:1)

代码中的一些错误

        /* Send data back */
        if (sendto(sd, (const char *)sendBuffer,(int)sizeof(sendBuffer), 0,
            (struct sockaddr *)&client, sizeof(client)) !=
            SOCKET_ERROR) // SHOULD BE == (1)
        {
            throw std::runtime_error("Error sending datagram.");
            // UNREACHABLE CODE (2)
            closesocket(sd);
            WSACleanup();
        }

错误1 :成功发送后输入错误块。这可能意味着您的错误未初始化(如果不是,则它将是来自其他地方的最后一个错误值)。根据{{​​1}}的MSDN文档,在WinSocket操作失败后,该函数应立即调用 ,并且仅在这些情况下。

如果您在成功操作(您正在进行)后调用它,则无法保证您将获得什么值。如果可能是此线程上另一个WinSocket操作的最后一个错误,它可能是0,它可能是其他一些值。文档没有说明如果在没有操作失败时检索到错误会发生什么,因此您可以将其视为未定义的行为。

错误2 :抛出异常后,该函数将立即退出。您不会致电WSAGetLastErrorclosesocket

更新:

我猜你在为它分配了任何值之前,正在检查调试器中WSACleanup的值。你应该按照以下方式做点什么:

err