// // This program receives data sent by sendsample. // // The Middle code used is the same as in the send sample: // MsgManager // (vector, string) @msg_id_1 // (set) @msg_id_2 // } // #include #include #include #include #include #include #include using namespace std; #include int main() try { int sockfd; int newsock; sockaddr_in serv_addr; char hostname[100]; hostent* hostEnt; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { cout << "socket() failed with errno of " << errno << "\n"; return 0; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = 12345; gethostname(hostname, sizeof(hostname)); if (hostEnt = gethostbyname(hostname)) { serv_addr.sin_addr = *(struct in_addr *)hostEnt->h_addr_list[0]; } else { return 0; } if (::bind(sockfd, (sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) { cout << "bind() failed with errno of " << errno << "\n"; return 0; } if (listen(sockfd, 3) < 0) { cout << "listen() failed with errno of " << errno << ".\n"; return 0; } auto_ptr > buffer(new ReceiveCompressedBuffer(4096)); socklen_t servlen = sizeof(serv_addr); set iset; set::iterator sit; set::iterator stend; vector ivec; vector::iterator vit; vector::iterator vend; string str; for (;;) { if ((newsock = accept(sockfd, (sockaddr*) &serv_addr, &servlen)) < 0) { cout << "accept() failed with errno of " << errno << ".\n"; return 0; } buffer->sock_ = newsock; uint16_t msgid = 0; uint32_t message_length = 0; buffer->SetMsgLength(sizeof(msgid) + sizeof(message_length)); buffer->Give(msgid); buffer->Give(message_length); buffer->SetMsgLength(message_length); switch (msgid) { case msg_id_1: MsgManager::Receive(buffer.get(), ivec, str); vit = ivec.begin(); vend = ivec.end(); for (; vit != vend; ++vit) { cout << *vit << " "; } ivec.clear(); cout << "\nstr is " << str << endl; break; case msg_id_2: MsgManager::Receive(buffer.get(), iset); sit = iset.begin(); stend = iset.end(); for (; sit != stend; ++sit) { cout << *sit << " "; } cout << endl; iset.clear(); break; default: cout << "Unexpected msg id. Value is " << msgid << endl; } close(newsock); } return 1; } catch (failure const & ex) { cout << "failure: " << ex.what() << endl; }