2013-01-07 2 views
0

UDP를 통해 일부 데이터를 전송할 때 Winsock2 소켓을 사용하고 있습니다. 데이터를 보내기 위해 배열을 sendTo() 함수에 전달하는 데 어려움을 겪고 있습니다.UDP 패킷을 보내는 함수에 배열 전달

나는 미래의 재사용을 위해 mySocket 클래스를 작성했으며, 현재 작동하는 다음과 같은 메소드가 있습니다.

bool MySocket::sendData() 
{ 
short int values[] = {1000,2000,3000,4000,5000}; 
int ret = sendto(sd,(const char*)values, sizeof(values) , 0, (sockaddr *)&sin, sizeof(sin)); 
if(ret == SOCKET_ERROR) 
{ 
    return false; 
} 
return true; 
} 

가 지금은 그래서 새로운 기능의 모습

short int values[] = {1000,2000,3000,4000,5000}; 

을 가진 대신 배열에 전달하려는 :

bool MySocket::sendData(short int data[]) 
{ 
    short int * values = data; 
int ret = sendto(sd,(const char*)&values, sizeof(data) , 0, (sockaddr *)&sin, sizeof(sin)); 
if(ret == SOCKET_ERROR) 
{ 
    return false; 
} 
return true; 
} 

함수가 호출 될 호출되면 :

short int data[] = {1000,2000,3000,4000,5000}; //Or some other pre-assembled list of short ints 
if(socket->sendData(data)) 
    cout << "Server: Packet Sent" << endl; 
else 
    cout << "Server_Error: Packet failed to send" << endl; 

나는 jus 데이터 또는 값에 대한 포인터의 주소를 가져 오는 중입니다. 나는 "&"과 포인터로 놀고 있었지만, 포인터가 가리키는 첫 번째 숫자 이외의 어떤 것도 전송하는 올바른 방법을 찾지 못했습니다. 나는 주로 C# 코드를 작성하고 C++로 다시 전환하면 포인터 기술이 녹슬어진다.

올바르게 전달하기 위해 전달 된 배열을 전달하거나 사용하려면 어떻게해야합니까?

+0

'짧은 INT * 값 = data' 왜 이렇게 그냥 이런 일을합니까? 왜'data'를 직접 사용하지 않을까요? –

+0

좋아, 내가 1000, 그리고 2000 포인터를 할당하는 대신 직접 데이터를 사용하여지고 있어요. – Brandon

+0

이것은'sizeof (data)'가 포인터의 크기이고, short 크기의 두 배입니다. 이 문제를 해결하는 방법에 대한 내 대답과 자세한 설명을 참조하십시오. –

답변

2

MySocket::sendData이 얻는 것은 포인터의 주소가 아니라 데이터에 대한 포인터 여야합니다. sizeof은 요소 수를 확인하는 올바른 방법이 아닙니다. 실제로, 그것은 당신이 말한대로 sizeof 포인터가 될 것입니다. 또한 (const char *)valuessendto으로 전달해야합니다. 그렇게 할 것입니다. 전송할 바이트 수를 계산하려면 요소 수를 sizeof(short)으로 곱하십시오. 따라서 추가 인수로 요소 수를 MySocket::sendData에 전달하는 것이 좋습니다.

bool MySocket::sendData(short int data[], int n_data) 
{ 
    int ret = sendto(sd, (const char*)values, n_data * sizeof(short) , 0, (sockaddr *)& sin, sizeof(sin)); 
    if(ret == SOCKET_ERROR) 
    { 
     return false; 
    } 
    return true; 
} 
+0

빠른 응답을 보내 주셔서 감사합니다. 나는 지금 일하고있다. – Brandon

1

송신 배열에 데이터 배열의 크기를 명시 적으로 전달해야합니다. 이것은 C 및 C++의 미묘한 중 하나입니다 - 배열 형식은 이 함수 인수로 전달 될 때 포인터에이 소멸되어 어레이 크기 정보를 잃게됩니다.

더 나은
bool sendInts(short* data, size_t count) { 
    int rc = ::send(data, count * sizeof(short), ...); 
    // handle errors etc. 
} 

또는 참조로 std::vector<short>을 :

bool sendInts(const std::vector<short>& data) { 
    assert(data.size() > 0); 
    int rc = ::send(&data[0], data.size() * sizeof(short), ...); 
    // handle errors etc. 
} 
+0

잘 작동합니다. 감사. – Brandon