当尝试使用 recvfrom
读取 UDP 数据包时,函数返回 -1 表示错误。我当然会调用 WSAGetLastError
来找出问题所在。报告的错误编号是 183。我似乎找不到关于该编号含义的任何引用。
编辑:
while (bytesRecv != SOCKET_ERROR)
{
// get data from the server
bytesRecv = recvfrom(m_socket, (char*)&receiveData, sizeof(ReceiveData), 0, (struct sockaddr *) &server_addr, &server_addr_len);
logError("Bytes recieved: ", bytesRecv);
// if data was recieved from the server
if (bytesRecv > 0)
{
//Data packet processing code
}
else
{
if (bytesRecv == SOCKET_ERROR)
{
logError("Error: Reading data: ", WSAGetLastError());
}
}
}
编辑:
void logError(const std::string &text, int errorCode)
{
std::ofstream log_file("error_log_file.txt", std::ios_base::out | std::ios_base::app);
log_file << text << errorCode << "\n";
}
最佳答案
问题不在于 WSAGetLastError()
本身。真正的问题是您在调用 WSAGetLastError()
之前调用了 logError()
,并且 logError()
最终将最后一个错误代码重置为183.
logError()
使用 std::ofstream
打开文件进行追加。在 Windows 上,该操作最终将调用 CreateFile()
使用 OPEN_ALWAYS
标志,其文档说明:
Opens a file, always.
If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS (183).
If the specified file does not exist and is a valid path to a writable location, the function creates a file and the last-error code is set to zero.
...
If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
在内部,WSAGetLastError()
只是映射到 GetLastError()
(一个众所周知但未记录的实现细节)。因此,无论CreateFile()
打开文件成功与否,WSAGetLastError()
报告的错误码都会重置为打开操作的结果。
您对 logError()
的调用在错误的位置。它需要在你的 if (bytesRecv > 0)
block 中移动(顺便说一句,UDP 支持 0 长度数据报,所以你应该使用 >=
而不是 >
):
while (true)
{
// get data from the server
bytesRecv = recvfrom(m_socket, (char*)&receiveData, sizeof(ReceiveData), 0, (struct sockaddr *) &server_addr, &server_addr_len);
// if data was received from the server
if (bytesRecv >= 0)
{
logError("Bytes received: ", bytesRecv); // <-- moved here!!!
//Data packet processing code
}
else // if (bytesRecv == SOCKET_ERROR)
{
logError("Error: Reading data: ", WSAGetLastError());
break;
}
}
或者:
while (true)
{
// get data from the server
bytesRecv = recvfrom(m_socket, (char*)&receiveData, sizeof(ReceiveData), 0, (struct sockaddr *) &server_addr, &server_addr_len);
// if data was received from the server
if (bytesRecv == SOCKET_ERROR)
{
logError("Error: Reading data: ", WSAGetLastError());
break;
}
logError("Bytes received: ", bytesRecv); // <-- moved here!!!
//Data packet processing code
}
关于c++ - 从 recvfrom 获取未记录的错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56468592/