// // This program receives data sent by sendsample. // // The Middle code used is the same as in the send sample: // MsgManager // (vector, char*) @MSGID_1 // (set) @MSGID_2 // (unsigned int) @IN // } // #include #include #include #include #include #include #include using namespace std; #include int main() { int sockfd; int newsock; sockaddr_in serv_addr; char hostname[100]; hostent* hostEnt; MsgManager msgs; set iset; set::iterator sit; set::iterator stend; vector ivec; vector::iterator vit; vector::iterator vend; char* str; 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 Buffer(4096)); socklen_t servlen = sizeof(serv_addr); for (;;) { if ((newsock = accept(sockfd, (sockaddr*) &serv_addr, &servlen)) < 0) { cout << "accept() failed with errno of " << errno << ".\n"; return 0; } buffer->sock_ = newsock; unsigned int msgid = 0; if (!msgs.Receive(buffer.get(), msgid)) { cout << "Receive of msgid failed." << endl; buffer->ews_.ListErrorWords(); } switch (msgid) { case MSGID_1: if (!msgs.Receive(buffer.get(), ivec, str)) { cout << "Receive() failed: MSGID_1." << endl; } vit = ivec.begin(); vend = ivec.end(); for (; vit != vend; ++vit) { cout << *vit << " "; } ivec.clear(); cout << "\nstr is " << str << endl; delete [] str; break; case MSGID_2: if (!msgs.Receive(buffer.get(), iset)) { cout << "Receive() failed: MSGID_2." << endl; } 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; }