在C ++中通过套接字发送和recv数组内容

时间:2013-09-04 07:33:46

标签: c++ arrays sockets

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

出于临时目的,我声明了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;
    }

我怎么都不能正确发送和回收。非常感谢您的帮助!

1 个答案:

答案 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)的转换,但如果您的数据变大,则通过将发送分成多个调用来正确处理这一点非常重要。同样对于接收端。另外,如您所见,我省略了所有错误检查。不要在实际代码中这样做。