void ShowAllObjects(Boss::ref_ptr<Boss::IEnum> collection) { Boss::EnumHelper<Boss::IBase> Collection(collection); for (auto i = Collection.First() ; i.Get() ; i = Collection.Next()) { double Price = 0; { Boss::qi_ptr<MyNs::IFaces::IFixPrice> FixPrice(i); if (!FixPrice.Get()) throw std::runtime_error("Unknown object."); if (FixPrice->GetPrice(&Price) != Boss::Status::Ok) throw std::runtime_error("Failed to get price."); } std::string ObjectType = "FixPrice"; Boss::qi_ptr<MyNs::IFaces::IBestOffer> BestOffer(i); std::vector<double> Offers; if (BestOffer.Get()) { ObjectType = "BestOffer"; Boss::ref_ptr<Boss::IEnum> AllOffers; if (BestOffer->GetAllOffers(AllOffers.GetPPtr()) != Boss::Status::Ok) throw std::runtime_error("Failed to get all offers for \"BestOffer\" object."); Boss::EnumHelper<MyNs::IFaces::IFixPrice> OffersEnum(AllOffers); for (auto j = OffersEnum.First() ; j.Get() ; j = OffersEnum.Next()) { double OfferPrice = 0; if (j->GetPrice(&OfferPrice) != Boss::Status::Ok) throw std::runtime_error("Failed to get offer price."); Offers.push_back(OfferPrice); } } else { Boss::qi_ptr<MyNs::IFaces::IAuction> Auction(i); if (Auction.Get()) ObjectType = "Auction"; } std::cout << "ObjectType: " << ObjectType << std::endl; std::cout << "\tPrice: " << Price << std::endl; if (!Offers.empty()) { std::cout << "\tOffers:\n\t\t"; std::copy(std::begin(Offers), std::end(Offers), std::ostream_iterator<double>(std::cout, "\n\t\t")); } std::cout << std::endl; } }
void Phase_3() { int iUDPBidd1 = 4933, iUDPBidd2 = 5033; int iTCPBidd1 = 3933, iTCPBidd2 = 4033; int iTCPSell1 =2933 , iTCPSell2 = 3033; int iUDPSock1, iUDPSock2; int iTCPSockB1, iTCPSockB2, iTCPSockS1, iTCPSockS2; struct sockaddr_in addrServ, addrBidd1, addrBidd2, addrSell1, addrSell2; socklen_t addlen = sizeof(addrBidd2); char buffTx[1024], buffRx1[1024], buffRx2[1024]; iUDPSock1 = socket(AF_INET, SOCK_DGRAM, 0); iUDPSock2 = socket(AF_INET, SOCK_DGRAM, 0); memset(&addrServ, 0, sizeof(addrServ)); addrServ.sin_family = AF_INET; addrServ.sin_port = htons(0); addrServ.sin_addr.s_addr = inet_addr("127.0.0.1"); int i; if(bind(iUDPSock1, (struct sockaddr *) &addrServ, sizeof(addrServ)) != 0) { perror("\nPhase 3: Bind Error "); } if(bind(iUDPSock2, (struct sockaddr *) &addrServ, sizeof(addrServ)) != 0) { perror("\nPhase 3: Bind Error "); } char szAucIP[20]; int iCh; int iBuffRx, iBuffTx; void *pAddr; struct sockaddr_in *pIP = (struct sockaddr_in *) &addrServ; pAddr = &pIP->sin_addr; inet_ntop(addrServ.sin_family, pAddr, szAucIP, sizeof(szAucIP)); iCh = getsockname(iUDPSock1, (struct sockaddr *) &addrServ, &addlen); printf("\nPhase 3: Auction Server has IP address: %s Auction UDP Port Number: %d", szAucIP, ntohs(addrServ.sin_port)); iCh = getsockname(iUDPSock2, (struct sockaddr *) &addrServ, &addlen); printf("\nPhase 3: Auction Server has IP address: %s Auction UDP Port Number: %d", szAucIP, ntohs(addrServ.sin_port)); memset(&addrBidd1, 0, sizeof(addrBidd1)); addrBidd1.sin_family = AF_INET; addrBidd1.sin_port = htons(iUDPBidd1); addrBidd1.sin_addr.s_addr = INADDR_ANY; memset(&addrBidd2, 0, sizeof(addrBidd2)); addrBidd2.sin_family = AF_INET; addrBidd2.sin_port = htons(iUDPBidd2); addrBidd2.sin_addr.s_addr = inet_addr("127.0.0.1");//INADDR_ANY; memset(&blist, 0, sizeof(blist)); ReadBroadcastList("broadcastList.txt", buffTx); //Send Broadcast List iBuffTx = sendto(iUDPSock1, buffTx, sizeof(buffTx), 0, (struct sockaddr *) &addrBidd1, addlen); iBuffTx = sendto(iUDPSock2, buffTx, sizeof(buffTx), 0, (struct sockaddr *) &addrBidd2, addlen); memset(&bidd1List, 0 ,sizeof(bidd1List)); memset(&bidd2List, 0 ,sizeof(bidd2List)); //if(fork() == 0) { iBuffRx = recvfrom(iUDPSock1, buffRx1, 1024, 0, (struct sockaddr *) &addrBidd1, &addlen); buffRx1[iBuffRx] = '\0'; RecieveBiddingList(buffRx1, &bidd1List); } //if(fork() == 0) { iBuffRx = recvfrom(iUDPSock2, buffRx2, 1024, 0, (struct sockaddr *) &addrBidd2, &addlen); buffRx2[iBuffRx] = '\0'; RecieveBiddingList(buffRx2, &bidd2List); } close(iUDPSock1); close(iUDPSock2); //Perform Auctioning Auction(blist, bidd1List, bidd2List); sleep(5); PrintFinalResult(); //For Bidder 1 PostResult_Bidd1(); //For Bidder 2 PostResult_Bidd2(); //For Seller 1 PostResult_Sell1(); //For Seller 2 PostResult_Sell2(); }