当尝试使用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";
}
答案 0 :(得分:2)
问题不在于WSAGetLastError()
本身。真正的问题是您在调用logError()
之前先调用WSAGetLastError()
,而logError()
最终将最后一个错误代码重置为183。
logError()
使用std::ofstream
打开要附加的文件。在Windows上,该操作最终将使用OPEN_ALWAYS
标志调用CreateFile()
,其文档说明:
始终打开文件。
如果指定的文件存在,则函数成功,并且最后一个错误代码设置为ERROR_ALREADY_EXISTS(183)。
如果指定的文件不存在,并且是可写位置的有效路径,则该函数将创建文件,并且最后一个错误代码设置为零。
...
如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展的错误信息,请致电GetLastError 。
在内部,WSAGetLastError()
仅映射到GetLastError()
(众所周知但未记录的实现细节)。因此,无论CreateFile()
打开文件成功与否,WSAGetLastError()
报告的错误代码都将重置为打开操作的结果。
您对logError()
的呼叫在错误的位置。需要将其移动到if (bytesRecv > 0)
块内部(顺便说一句,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
}