当尝试使用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";
}
发布于 2019-06-06 06:37:15
问题不在于WSAGetLastError()
本身。真正的问题是,您在调用WSAGetLastError()
之前调用了logError()
,而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
}
https://stackoverflow.com/questions/56468592
复制相似问题