2011-12-14 3 views
0

Я пытаюсь использовать this Класс C++ в качестве базы для связи между клиентом и сервером моего собственного приложения. Клиент и сервер оба имеют класс «человек», который я хочу сериализации:Сбой приложения при отправке форсированной последовательной передачи по сокету

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

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

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

должен быть превращен в

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

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

+0

Спасибо refp, работал как шарм .. не могу поверить, что я продолжаю испортить эти тривиальные вещи; – natli