我将一些数据带入阵列并将其发送到接收器。问题是我将得到的数组大小未预定义。
出于临时目的,我声明了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
}
在rec end:
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;
}
我怎么都不能正确发送和回收。非常感谢您的帮助!
答案 0 :(得分:3)
通过套接字(或几乎任何其他通信设备)发送可变长度数据的原则始终是相同的:首先发送数据大小,以便接收方知道接下来会发生什么,然后发送实际数据。在这种情况下,你想发送一个整数数组,因为这是C ++,我将使用vector&lt;给出一个伪代码示例。 int&gt; (虽然它适用于任何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)的转换,但如果您的数据变大,则通过将发送分成多个调用来正确处理这一点非常重要。同样对于接收端。另外,如您所见,我省略了所有错误检查。不要在实际代码中这样做。