在以下情况下从套接字读取数据已损坏?

Posted

技术标签:

【中文标题】在以下情况下从套接字读取数据已损坏?【英文标题】:Reading the data from socket is currupted in following condition? 【发布时间】:2013-07-18 17:19:24 【问题描述】:

我正在逐包读取套接字数据包并写入另一个缓冲区以组合所有数据。

BOOL _ReadPacket(PBYTE BufferRead, DWORD &Length, SOCKET Socket)

    WSABUF Buffer;
    DWORD Flags = 0;
    int Result = 0;
    FILE *file;
    Buffer.buf = (char *)BufferRead;
    Buffer.len = Length;
    Flags = 0;
    Result = WSARecv(Socket, &Buffer, 1, &Length, &Flags, NULL, NULL);

    // if ((file=fopen("D:/test/test1/test1.txt","a+") ) != NULL)
    // 
    //UINT val = Buffer.len;
    //fprintf(file, "%d\n", val);
    //
    //fflush(file);
    //fclose(file);
    //
    return(Result != SOCKET_ERROR);

取消注释已注释的代码可解决问题。为什么我在注释掉代码时会收到损坏的数据?

【问题讨论】:

你确定BufferRead 是合法的吗?您是否收到来自WSARecv 的错误?你WSAInitialize(或其他)吗? 【参考方案1】:

WSARecv 的第四个参数应该是一个指向接收到的字节数的指针。但是,您将指针的地址传递给缓冲区的长度。

如果你传递的是指针,而不是指向指针的指针,那么它会很奇怪,但它应该可以正常工作(因为它不会破坏任何东西)。然而,就像现在一样,它可能会写在不应该写的地方。

简而言之:检查并修复第四个参数。

【讨论】:

以上是关于在以下情况下从套接字读取数据已损坏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用临时文件的情况下从 Java 中的嵌套 zip 文件中读取数据?

在不使用 UTL_FILE 的情况下从 PL/SQL 中的文件读取/写入数据

如何在这种情况下从多个csv文件读取数据并生成报告?

目录已损坏无法读取

文件或目录已损坏且无法读取

如何在不使用index.js文件中的触发器功能的情况下从Firestore数据库读取数据?