Winsock recv() 返回不正确的数据

Posted

技术标签:

【中文标题】Winsock recv() 返回不正确的数据【英文标题】:Winsock recv() returning incorrect data 【发布时间】:2012-11-29 05:42:55 【问题描述】:

我的服务器 recv() 来自客户端的数据包并且必须显示它。 问题是它没有显示正确的数据

代码如下:

    iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
    if (iResult > 0) 
        for ( int i = 0; i < iResult; i++ ) 
            printf( "%02x ", buf[i] );
        
        printf( "\n" );

    // return "cc cc cc cc cc cc cc cc cc cc"
    // correct return "0A 00 2C 01 29 00 0D 00 B4 01"

当客户端连接时,服务器显示cc cc cc cc cc cc cc cc cc cc,但这是不对的 应该是0A 00 2C 01 29 00 0D 00 B4 01


更新

    #define DEFAULT_BUFLEN 512

    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;

    iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
    if (iResult > 0) 
        for ( int i = 0; i < iResult; i++ ) 
            printf( "%02x ", recvbuf[i] );
        
        printf( "\n" );

    // return "0A 00 2C 01 23 00 0c 00 ffffffB3 01"
    // correct return "0A 00 2C 01 23 00 0c 00 B3 01"

现在数据包上有额外的 ffffff,即使我只有 10 个字节。

【问题讨论】:

查看您在recv 调用中使用的变量与您在printf 调用中使用的变量。 我更新了我的问题。谢谢你,非常愚蠢的错误。我没注意到。 :) 无论如何,现在它返回的数据比预期的要多。 【参考方案1】:

现在数据是正确的。当您传递给printfchar 值被提升为int 时,您看到的是符号扩展。您可以将char 转换为unsigned char,它应该可以正常显示。

for ( int i = 0; i < iResult; i++ ) 
    printf( "%02x ", static_cast<unsigned char>( recvbuf[i] ) );

【讨论】:

谢谢。我得到了它。最后一件事先生,我如何在数据包嗅探器上发送 00 00 的数据?这是正确的吗? send( ClientSocket, "", 2, 0); 您可以将其作为任何其他数据发送,将其添加到缓冲区并发送缓冲区中的字节。您上面显示的内容不正确。 你能告诉我这样做的正确方法吗?数据为 0x00 0x00。所以从技术上讲,它是一个空包,对吧?只是空空。它就像一个支票包。 char buf[2] = 0x00, 0x00; send( ClientSocket, buf, 2, 0 ); 但是,大概您通过构造一个包含一定数量字节的缓冲区然后发送该缓冲区来在程序中发送其他数据。我就是这样做的,缓冲区的内容无关紧要,无论是否全为零,它都是数据。

以上是关于Winsock recv() 返回不正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

Winsock recv() 不阻塞

同时执行 recv() 和 send() winsock

如何中止winsock阻塞调用?

当调用winsock 中的recv 函数并且没有收到所有数据时会发生啥?

使用 Winsock 的 send()/recv() 时是不是需要确认响应?

面临 recv() 和 send() winsock api 的问题。 Recv() 在接收最后一个数据包时挂起