0

UDP 経由でデータを転送するために Winsock2 ソケットを使用しています。配列を sendTo() 関数に渡してデータを送信するのに問題があります。

将来の再利用のために 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;

データまたは値のポインターのアドレスを取得しているようです。「&」とポインターをいじってみましたが、ポインターが指している最初の数字以外を転送する正しい方法が見つかりませんでした。私は主に C# でコードを書いていますが、C++ に戻った今、私のポインター スキルはかなり錆びています。

渡された配列を正しく送信するには、どのように渡すか使用しますか?

4

2 に答える 2

2

取得してMySocket::sendDataいるのは、ポインターのアドレスではなく、データへのポインターである必要があります。sizeof要素数を確認する正しい方法ではありません。確かに、それはsizeofあなたが言っているようにポインターになります。また、 に渡す必要があり(const char *)valuesますsendto。それでいい。送信するバイト数を計算するには、要素数に を掛けます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;
}
于 2013-01-07T19:46:10.877 に答える
1

データ配列のサイズを送信関数に明示的に渡す必要があります。これは、C および C++ の微妙な点の 1 つです。配列型は、関数の引数として渡されるとポインターに減衰するため、配列サイズ情報が失われます。次のようなことをしてください:

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.
}
于 2013-01-07T19:53:30.357 に答える