2013-11-04 3 views
0

소켓 프로그램을 수행하고 있고 서버가 장치에 연결된 후 해당 프로그램에 메시지를 보내려고합니다. 하지만 send() 함수는 배열에 저장된 바이트 수보다 큰 바이트 수를 반환합니다. 그리고 메시지는 전송되지 않습니다. 여기 send() 함수가 필요한 바이트를 더 반환합니다. C++

내 코드입니다 :

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

사람이 왜 이런 일이 알고?

+0

CHAR 유형이'char'입니까? 그것은 가능합니까 wchar입니까? 보십시오 cout << sizeof (CHAR). –

답변

2

HEX_bufferMessage의 유형은 CHAR에 대한 포인터입니다. 귀하의 paltform에서 sizeof (HEX_bufferMessage) 8을 사용하고 있습니다.

+0

하지만 위치가 7 개인 배열이있는 경우 왜 8과 같습니까? – user2928858

+3

@ user2928858 : 듣지 않으므로. 'sizeof'는 "이 포인터가 가리키는 배열의 요소 수를 얻지"않습니다. 그것은 "이 물건의 크기를 얻는다"이고 "이 물건"은 포인터입니다. 포인터는 시스템에서 8 바이트의 단일 오브젝트 값입니다. –

+0

CHAR HEX_bufferMessage [7]을 선언 할 경우; sizeof (HEX_bufferMessage)는 실제로 7과 같습니다. 그러나 실제로 sizeof (CHAR *)를 사용하고 있습니다. 귀하의 플랫폼에서 sizeof (CHAR *)가 8과 같다고 보입니다. –

4

sizeof(HEX_bufferMessage)이 아닙니다. HEX_bufferMessage 유형은 [아마도] char*이고 [] 크기는 [64 비트] 시스템에서 8 바이트입니다.

숫자 대신 7을 전달하고, 바람직하게는 상수를 사용하고 7 값이 실제로 고정되어 있으면 해당 동적 할당을 제거하십시오.

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

// ... 

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

당신이 다음 sizeof(myPointer) 당신에게 포인터의 크기를 줄 것이다 (즉, 64 비트 시스템에서 32 비트 시스템, 8 4 바이트),

TYPE* myPointer;

있어 가정 배열의 크기가
이 아닙니다.

당신은 당신이 sizeof(HEX_buffer_message)HEX_buffer_message의 요소 수를 산출한다고 가정 보인다

const int bufferSize = 7; 
HEX_bufferMessage = new CHAR[bufferSize]; 

... 

retorno = send(sckSloMo, HEX_bufferMessage, sizeof(CHAR) * bufferSize, 0); 
+0

작은 고정 된 범위의 배열을 왜'new'하고 싶습니까? –

+0

당신은 바인딩이 고정되어 있다고 가정하지 않을 것입니다 - 오류가 포인터 정의로 인한 것이므로 혼란을 줄이기 위해 가능한 한 원래 코드를 거의 변경하지 않고 있습니다. – benjymous

+0

benjymous! =) – user2928858

0

하고 싶어. 그렇지 않습니다. 그것은 7보다는 8을 산출하는 64 비트 포인터 인 것처럼 보이는 HEX_buffer_message 유형의 크기를 생성합니다. 반환 된 포인터에서 new T[n]으로 할당 된 배열의 크기를 결정할 방법이 없습니다. 어떻게 든 지나친 n을 사용해야합니다.

+0

'HEX_buffer_message'의 요소 수'[그것은 초래하지 않습니다] 글쎄, 그렇습니다. 만약'HEX_buffer_message' 배열 및 _had_ 요소였습니다. –

+0

@LightnessRacesinOrbit : ... 요소의 크기는 1이었습니다. 예,'sizeof (x)'가'x'의 요소 수를 반환하지만 주어진 예제가 그 중 하나가 아닌 경우가 있습니다. –

관련 문제