【发布时间】:2023-03-20 23:31:01
【问题描述】:
当尝试使用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";
}
【问题讨论】:
-
@NathanielJohnson 该论坛帖子似乎没有谈论 recvfrom。无论如何,提到的错误消息在上下文中没有任何意义。
-
WSAGetLastError()不可能为失败的recvfrom()调用报告 183 (ERROR_ALREADY_EXISTS)。该错误代码必须来自其他东西,这意味着您的错误处理代码中有错误。由于WSAGetLastError()仅映射到GetLastError(),您是否在失败的recvfrom()和WSAGetLastError()之前进行任何其他函数调用,这可能会重置调用线程的错误代码?请edit您的问题以显示您的实际代码。 -
@RemyLebeau 正如您从上面的代码中看到的那样,没有什么可做的错误。我同意错误代码没有意义,这就是我在这里的原因。
-
您的
logError()函数使用std::ofstream附加到现有文件。为此,ofstream最终必须调用带有OPEN_ALWAYS标志的CreateFile(),documentation 声明:“总是打开一个文件。如果指定的文件存在,则函数成功并且最后一个错误代码设置为 ERROR_ALREADY_EXISTS (183)。 如果指定的文件不存在并且是可写位置的有效路径,则函数创建一个文件并设置最后一个错误代码归零。"