Сбой приложения при отправке расширенной сериализации через сокет - PullRequest
0 голосов
/ 14 декабря 2011

Я пытаюсь использовать этот класс C ++ в качестве основы для взаимодействия клиента и сервера моего собственного приложения.И клиент, и сервер имеют класс person, который я хочу сериализовать:

class person
{
public:
  person()
  {
  }

  person(int age)
    : age_(age)
  {
  }

  int age() const
  {
    return age_;
  }

private:
  friend class boost::serialization::access;

  template <typename Archive>
  void serialize(Archive &ar, const unsigned int version)
  {
    ar & age_;
  }

  int age_;
};

Я пытаюсь сериализовать объект на сервере, отправить эту сериализацию клиенту и создать новыйобъекта из него нет.

сервер

while(1)
{
    string clientMessageIn = "";

    // receive from the client

    int numBytes = client->recieveMessage(clientMessageIn);
    if ( numBytes == -99 ) break;

    if(clientMessageIn == "getObject") //Client asked for object
    {
        boost::archive::text_oarchive oa(ss);
        person pi(31); //Create 31 year old person
        oa << pi; //Serialize

        std::string mystring;
        ss >> mystring; //Serialization to string so we can send it

        string sendMsg(mystring); //Set sendMsg (redundant.. probably)
        mystring.clear(); //No longer need mystring
        client->sendMessage(sendMsg); //Send the actual response to the client
        sendMsg.clear(); //Clear
        ss.clear(); //Clear
    }
    else //Client typed something else, just show it
        cout   << "[RECV:" << clientHost << "]: " << clientMessageIn << endl;
}

клиент

int recvBytes = 0;

while (1)
{
    // send message to server

    char sendmsg[MAX_MSG_LEN+1];
    memset(sendmsg,0,sizeof(sendmsg));
    cout << "[" << localHostName << ":SEND] ";
    cin.getline(sendmsg,MAX_MSG_LEN);

    string sendMsg(sendmsg);
    if ( sendMsg.compare("Bye") == 0 || sendMsg.compare("bye") == 0 ) break;

    myClient.sendMessage(sendMsg);



    // receive response from server

    string clientMessageIn = "";
    recvBytes = myClient.recieveMessage(clientMessageIn);
    if ( recvBytes == -99 ) break;

    //stringstream ss;
    //ss << clientMessageIn; //Server response to ss
    //boost::archive::text_iarchive ia(ss); //This bit is causing the crash

    //person p;
    //ia >> p; //Unserialize

    //ss.clear(); //No longer need the ss contents

    //cout   << "[RECV:" << serverName << "]: " << p.age<< endl; //This doesn't work now
    cout   << "[RECV:" << serverName << "]: " << clientMessageIn << endl;

}

boost::archive::text_iarchive ia(ss); вызывает сбой;boost::archive::archive_exception at memory location

Я должен был это закомментировать, крушение не вызывает удивления.Просто посмотрите, что сервер отправляет обратно.

client

Как вы можете видеть, каждый раз, когда я набираю getObject, сервер отправляет:

22
serialization::archive
9
0
0
31

И затемэто начинается снова.Поэтому я предполагаю, что приложение вылетает, потому что оно не получает полный сериализованный объект.Я также понятия не имею, что делает большинство этих номеров и почему они отправляются по одному.

Что я делаю не так?

1 Ответ

1 голос
/ 14 декабря 2011

Как вы уже указали, вы не отправляете весь сериализованный буфер данных.

    std::string mystring;
    ss >> mystring; //Serialization to string so we can send it

следует преобразовать в

    std::string mystring (ss.str ());

вместо чтения до первого пробелатеперь мы храним весь сериализованный контент в mystring.

...