I modify the code by bernard prompt.
subscriber:
#include "resource.h"
#include <IceUtil/IceUtil.h>
#include <Ice/Ice.h>
#include <IceStorm/IceStorm.h>
#include "Monitor.h"
#include <Windows.h>
//读写文件
#include <iostream>//cout
........
........
........
struct INITIALLIZE
{
Ice::CommunicatorPtr communicator;
IceStorm::TopicManagerPrx manager;
Ice::ObjectAdapterPtr adapter;
};
INITIALLIZE initializeSub(int argc, char** argv)
{
//initialize communicator
INITIALLIZE initializeptr;
Ice::CommunicatorPtr communicator;
Ice::InitializationData initData;
initData.properties = Ice::createProperties();
string config = "config.sub";
try
{
initData.properties->load(config);
}
catch(const Ice::FileException&)
{
exit(0);
}
communicator = Ice::initialize(argc, argv, initData);
cout<<"communicator is :"<<communicator<<endl;
//initialize manager
enum Option { None, Datagram, Twoway, Oneway, Ordered};
Option option = None;
option = Oneway;
IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(
communicator->propertyToProxy("TopicManager.Proxy"));
cout<<"manager is :"<<manager<<endl;
if(!manager)
{
printf("invalid proxy !\n");
//return EXIT_FAILURE;
}
//initialize adapter
Ice::ObjectAdapterPtr adapter;
adapter = communicator->createObjectAdapter("Transporter.Subscriber");
cout<<"adapter is : "<<adapter<<endl;
initializeptr.manager=manager;
initializeptr.communicator=communicator;
initializeptr.adapter=adapter;
return initializeptr;
}
//- create your subscriber
//- retrieve or create topic1, topic2, topic3 (etc.)
//- register your subscriber with each topic
static int times=0;
int Sub(const string& topicName, const INITIALLIZE& Initializationptr)
{
++times;
Ice::CommunicatorPtr communicator=Initializationptr.communicator;
IceStorm::TopicManagerPrx manager=Initializationptr.manager;
Ice::ObjectAdapterPtr adapter=Initializationptr.adapter;
IceStorm::TopicPrx topic;
try
{
topic = manager->retrieve(topicName);
}
catch(const IceStorm::NoSuchTopic&)
{
try
{
topic = manager->create(topicName);
}
catch(const IceStorm::TopicExists&)
{
printf("temporary failure. try again.\n");
return EXIT_FAILURE;
}
}
Ice::Identity subId;
subId.name = topicName;
if(subId.name.empty())
{
subId.name = IceUtil::generateUUID();
}
Ice::ObjectPrx subscriber;
subscriber = adapter->add(new TransporterI, subId);
subscriber = subscriber->ice_oneway();
// subscriber = subscriber->ice_twoway();
IceStorm::QoS qos;
qos["reliability"] = "";
try
{
topic->subscribeAndGetPublisher(qos, subscriber);
}
catch(const IceStorm::AlreadySubscribed&)
{
//cout << "reactivating persistent subscriber" << endl;
printf("reactivating persistent subscriber\n");
}
if (times==1)
{
adapter->activate();
}
cout<<"订阅主题为"<<topicName<<endl;
communicator->waitForShutdown();
cout<<"等待结束"<<endl;
return EXIT_SUCCESS;
}
int main(int argc, char** argv)
{
INITIALLIZE Initializationptr=initializeSub( argc, argv );//初始化
Sub("Weather",Initializationptr);
// Sleep(120000);
}
when I run subscriber to get dada from publisher many times only one or two time receive data from publisher ?
I check the code carefully many times but can not find the bug !
Who can tell me the reason?
What should I modify the subscriber code to receive data steady?
Thanks a lot !
Today, in china ,it is the Mid-Autumn Festival ,best wishes for bernard and everyone in the www.zero.com!

Reply With Quote
emoIceStorm/TopicManager -t:tcp -h 127.0.0.1 -p 10000
rotocol error: out of bounds during unmarshaling
