0

我正在使用 Winsock2 套接字通过 UDP 传输一些数据。我在将数组传递到 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 *)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;
}
于 2013-01-07T19:46:10.877 回答
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.
}
于 2013-01-07T19:53:30.357 回答