【问题标题】:send() function returns more bytes that it was required c++send() 函数返回所需的更多字节 c++
【发布时间】:2013-12-28 04:32:07
【问题描述】:

我正在做一个套接字程序,在我的服务器与设备连接后,我正试图向他发送消息。但是 send() 函数返回的字节数大于存储在我的数组中的字节数。并且没有发送消息。

这是我的代码:

StartSendingMessages()
{
    int retorno;
    CString TextRetorno;

    HEX_bufferMessage = new CHAR[7]; // there are seven bytes

    // specifies the state
    HEX_bufferMessage[0] = 0xF0;
    HEX_bufferMessage[1] = 0x15;
    HEX_bufferMessage[2] = 0x31;
    HEX_bufferMessage[3] = 0x04;
    HEX_bufferMessage[4] = 0x02; // green
    HEX_bufferMessage[5] = 0x0E; // C1
    HEX_bufferMessage[6] = 0xF7;

    retorno = send(sckSloMo, HEX_bufferMessage, sizeof(HEX_bufferMessage), 0); 

    TextRetorno.Format("%d", retorno); // retorno = 8
    AfxMessageBox("Bytes enviados: " + TextRetorno);

    if (retorno == SOCKET_ERROR)
    {
        AfxMessageBox("Error Send!!");
        return;
    }
    else if(retorno != 0)
    {
        AfxMessageBox("Send() OK !!");
    }
}

有人知道为什么会这样吗?

【问题讨论】:

  • CHAR 类型是char 吗?有可能是wchar吗?试试 cout

标签: c++ sockets char buffer


【解决方案1】:

你说的不是sizeof(HEX_bufferMessage)HEX_bufferMessage 的类型 [大概] char*char* 的大小在您的 [64 位] 系统上是 8 个字节。

改为传递数字 7,最好使用常量,如果值 7 确实是固定的,则摆脱动态分配。

const int BUF_SIZE = 7;
char HEX_bufferMessage[BUF_SIZE];

// ...

retorno = send(sckSloMo, &HEX_bufferMessage[0], BUF_SIZE, 0); 

【讨论】:

    【解决方案2】:

    HEX_bufferMessage 的类型是指向 CHAR 的指针。您在您的 paltform 中使用的 sizeof(HEX_bufferMessage) 等于 8。

    【讨论】:

    • 但是如果我有一个只有七个位置的数组,为什么它等于 8?
    • @user2928858:因为你没有在听。 sizeof 不是“获取此指针指向的数组中的元素数”。它是“获取这个东西的大小”,“这个东西”是一个指针。指针是单个对象值,在您的系统上宽度为 8 个字节。
    • 如果你要声明 CHAR HEX_bufferMessage[7];那么 sizeof( HEX_bufferMessage ) 确实将等于 7。但是您实际上使用的是 sizeof( CHAR * )。看来在你的平台 sizeof(CHAR *) 等于 8,
    【解决方案3】:

    假设你有

    TYPE* myPointer;

    然后sizeof(myPointer) 会给你指针的大小(即 32 位系统上的 4 个字节,64 位系统上的 8 个字节),不是数组的大小。

    你想做的

    const int bufferSize = 7;
    HEX_bufferMessage = new CHAR[bufferSize]; 
    
    ...
    
    retorno = send(sckSloMo, HEX_bufferMessage, sizeof(CHAR) * bufferSize, 0); 
    

    【讨论】:

    • 你为什么要new一个小而固定的数组?
    • 你不会,假设边界是固定的 - 我只是对原始代码进行尽可能少的更改,以减少混淆(因为错误是由于指针定义引起的)跨度>
    • 传递固定值 7 有效,返回值等于 7。但是 send() 函数仍然不起作用。 =[
    • 我的设备是一个视频服务器控制器,为了与他通信,我需要以十六进制格式发送消息。我正在发送您看到的信息,但似乎他没有收到或理解它们。我不知道有什么问题......
    • 那么听起来这与您最初的“发送错误的字节数”问题无关,因此超出了这里的范围。大概您的消息块不正确,但如果不了解您在做什么,我们无法提供帮助。
    【解决方案4】:

    您似乎假设sizeof(HEX_buffer_message) 产生HEX_buffer_message 中的元素数。它没有。它产生HEX_buffer_message 类型的大小,这似乎是一个产生8 而不是7 的64 位指针。无法从返回的指针中确定使用new T[n] 分配的数组的大小。您需要使用以某种方式传递的n

    【讨论】:

    • [It doesn't yield] the number of elements in HEX_buffer_message 嗯,是的,如果HEX_buffer_message 是一个数组并且个元素,它会。
    • @LightnessRacesinOrbit: ... 并且元素的大小为 1。是的,在某些情况下,sizeof(x) 确实返回了 x 中的元素数量,但给定的示例不是一个其中。
    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 2017-02-13
    • 1970-01-01
    • 2012-12-20
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多