通过C++中的套接字发送和接收数组内容
Sending and recv array content through socket in C++
我正在将一些数据放入数组并将其发送到接收器。问题是我将得到的数组大小不是预定义的。
出于临时目的,我声明了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 %dn", 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;
}
我怎么就不能正确地发送和接收。非常感谢您的帮助!
通过套接字(或几乎任何其他通信设备)发送可变长度数据的原理总是一样的:首先发送数据的大小,以便接收器知道接下来会发生什么,然后发送实际数据。在这种情况下,您想要发送一个整数数组,由于这是C++,我将使用vector<int>(尽管它应该适用于任何POD类型和任何类型的ossocket/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)的强制转换,但如果数据变大,则重要的是通过多个调用拆分send来正确处理。接收端也是如此。此外,正如您所看到的,我省略了所有的错误检查。不要在实际代码中这样做。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '