c++ - 从 recvfrom 获取未记录的错误代码

标签 c++ udp recvfrom

当尝试使用 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/

相关文章:

c++ - 使用 Boost.GIL 创建图像

c++ - 使用可变模板参数传递成员函数指针是不明确的

c - 如何在DPDK中生成增量数据值

python - 尝试将 python 套接字绑定(bind)到 IPv6 地址时参数无效

C++ recvfrom 超时

c++ - 检查用户是否向 int var 输入了一个 float ?

php - 在 C++ 和 PHP 程序之间传递大数据

.net - Socket 是否会将 IP 分段数据包作为一个重组的 UDP 数据包传送?

c++ - 使用 MSG_DONTWAIT 的 C UDP 接收套接字总是失败

linux - recvfrom() 在接收到 udp 数据包时解除阻塞,但返回 0 作为读取字节的大小(使用 oscpack)