通过C++中的套接字发送和接收数组内容

Sending and recv array content through socket in C++

本文关键字:数组 C++ 套接字 通过      更新时间:2023-10-16

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

出于临时目的,我声明了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来正确处理。接收端也是如此。此外,正如您所看到的,我省略了所有的错误检查。不要在实际代码中这样做。