tutorial smart remix online español curso aprender c++ sockets char buffer

c++ - smart - solidity español



La función send() devuelve más bytes que los necesarios c++ (4)

Estoy haciendo un programa de socket y, después de que mi servidor esté conectado con el dispositivo, estoy tratando de enviarle un mensaje. Pero la función send () devuelve una cantidad de bytes mayor que la cantidad de bytes que está almacenada en mi matriz. Y el mensaje no se envía.

Aquí está mi código:

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 !!"); } }

¿Alguien sabe por qué está pasando esto?


El tipo de HEX_bufferMessage es un puntero a CHAR. Está utilizando sizeof (HEX_bufferMessage) que es igual a 8 en su forma de página.


No quiso decir sizeof(HEX_bufferMessage) . El tipo de HEX_bufferMessage es [presumiblemente] char* , y el tamaño de un char* es de 8 bytes en su sistema [64 bits].

Pase el número 7 lugar, de preferencia usando una constante, y elimine esa asignación dinámica si el valor 7 realmente es fijo.

const int BUF_SIZE = 7; char HEX_bufferMessage[BUF_SIZE]; // ... retorno = send(sckSloMo, &HEX_bufferMessage[0], BUF_SIZE, 0);


Parece que supone que sizeof(HEX_buffer_message) produce la cantidad de elementos en HEX_buffer_message . No es así Produce el tamaño del tipo de HEX_buffer_message que parece ser un puntero de 64 bits que produce 8 lugar de 7 . No hay forma de determinar el tamaño de una matriz asignada con la new T[n] del puntero devuelto. Tendrá que usar el n pasado de alguna manera.


Suponiendo que tienes

TYPE* myPointer;

then sizeof(myPointer) le dará el tamaño del puntero (es decir, 4 bytes en un sistema de 32 bits, 8 en un sistema de 64 bits), no el tamaño de la matriz.

Quieres hacer

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