Exemple #1
0
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();
}