0

我将一些数据放入数组并将其发送到接收器。问题是我将得到的数组大小不是预定义的。

出于临时目的,我声明int ar[10]了它可以正常工作。但这不是我认为的正确方式。如何在这里动态分配它的大小?

在发送方:

for (std::map < int, std::vector < std::string > >::iterator hit = three_highest.begin(); hit != three_highest.end(); ++hit) {
for (std::vector < std::string >::iterator vit = (*hit).second.begin(); vit != (*hit).second.end(); vit++) {
        ar[i]= hit-> first;
        i++;
    }
    }

    if ((bytecount = send(*csock, (char *)ar, i *sizeof(int), 0)) == -1) { // Here we cant send lenth-1. It consider exact
            }

在记录结束时:

if((bytecount = recv(hsock, ar, sizeof(ar), 0))== -1){
        fprintf(stderr, "Error receiving data %d\n", errno);
        goto FINISH;
    }
     x= sizeof(ar)/sizeof(int);
    printf("x is %d: \n ",x);
    for(i=0; i < (sizeof(ar)/sizeof(*ar));i++)
    {
        std::cout << ar[i] << std::endl;
    }

我怎么无法正确发送和接收。您的帮助将不胜感激!

4

1 回答 1

4

通过套接字(或几乎任何其他通信设备)发送可变长度数据的原理始终相同:首先发送数据的大小,以便接收者知道接下来会发生什么,然后发送实际数据。在这种情况下,你想发送一个整数数组,因为这是 C++,我将给出一个使用 vector<int> 的伪代码示例(尽管它应该适用于任何 POD 类型和任何类型的 os socket/port/... ):

//this is of utter importance: sender and receiver must use the same types
typedef std::int64_t size_type;

void Send( const std::vector< int >& vec, socket sock )
{
  const size_type sz = vec.size();
  send( sock, &sz, sizeof( sz ) );
  send( sock, &(*vec.first()), sz * sizeof( int ) );
}

void Recv( std::vector< int >& vec, socket soc )
{
  size_type sz;
  recv( sock, &sz, sizeof( sz ) );
  vec.resize( sz );
  recv( sock, &(*vec.first()), sz * sizeof( int ) );
}

//make an array containing 3 elements
std::vector< int > ar;
ar.push_back( 0 );
ar.push_back( 1 );
ar.push_back( 2 );
Send( ar, socket );

//the other end
std::vector< int > ar;
Recv( ar, sock );
//now ar contains 0,1,2

重要提示:我省略了从 size_type 到 int 的转换(通常是 send/recv),但是如果您的数据变大,通过将发送拆分为多个调用来正确处理这一点很重要。对于接收端也是如此。此外,如您所见,我省略了所有错误检查。不要在实际代码中这样做。

于 2013-09-04T07:50:28.507 回答