我在.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套接字错误代码。
答案 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 :抛出异常后,该函数将立即退出。您不会致电WSAGetLastError
或closesocket
更新:
我猜你在为它分配了任何值之前,正在检查调试器中WSACleanup
的值。你应该按照以下方式做点什么:
err