Ric, Thank you for your kindly advice. I'll have a try.
Roy. On Thu, Aug 15, 2013 at 3:25 AM, <[email protected]> wrote: > You will need to serialise it somehow. > > We use protocol buffers (from google), but other options are things like > thrift (from facebook), message pack or many others. > > If you don't want to use any of the existing ones you could hack your own > up, but this will get old real quick, something like (untested): > > std::string serialised = wd.Symbol + "," + wd.Time; > zmq::message_t msg(serialised.size()); > memcpy(msg.data(), serialised.data(), serialised.size()); > > and on the other side: > > std::string serialised((char*)msg.data(), (char*)msg.data() + msg.size()); > std::string::size_type commaPos = serialised.find(','); > wd.Symbol = serialised.substr(0, commaPos ); > wd.Time= serialised.substr(commaPos +1, serialised.size() - commaPos - 1); > > I may well have messed up the +1 and -1 there, but you get the idea. You > could also use std::stringstream and std::getline to make things easier. > > Like I say, this gets old fast so if you have a lot of structures you need > to send I'd consider using a real serialisation mechanism. > > Ric. > > > [image: Inactive hide details for liuchuanbo---14/08/2013 04:27:58 > PM---Ric, I have tried it. You're exactly right!]liuchuanbo---14/08/2013 > 04:27:58 PM---Ric, I have tried it. You're exactly right! > > > From: [email protected] > To: "ZeroMQ development list" <[email protected]>, > Cc: [email protected] > Date: 14/08/2013 04:27 PM > > Subject: Re: [zeromq-dev] PUB sent, but SUB can not receive. > Sent by: [email protected] > ------------------------------ > > > > Ric, > > I have tried it. You're exactly right! > > OS is the Windows here. > Actually, WData.Symbol is all less than 16 characters, and WData.Time is > all more than 16 characters(like 2013-08-08 10:00:00). > When I set WData.Symbol to more than 16 chars manually, pointer failed. > > Please tell me how to resolve this thing? > > BTW, the WData struct can not be changed. > > Roy. > > On Aug 14, 2013, at 10:36 PM, > *[email protected]*<[email protected]> > wrote: > > > Is this on windows? > > If so the stl implementation on widows (and clangs implementation, but > not gcc) uses something called the small string optimisation, any string > less than or equal to 16 characters will be stored within the string class > itself so will copy over, anything more than 16 characters will be > allocated on the heap and string will keep a pointer to it, this will not > be copied over. > > So try a symbol with more than 16 characters and it will probably fail. > > Ric. > > > <graycol.gif>liuchuanbo---14/08/2013 01:59:43 PM---Hi, Ric Right, > string is std::string. > > From: *[email protected]* <[email protected]> > To: "ZeroMQ development list" > <*[email protected]*<[email protected]>>, > > Cc: > *[email protected]*<[email protected]> > Date: 14/08/2013 01:59 PM > Subject: Re: [zeromq-dev] PUB sent, but SUB can not receive. > Sent by: > *[email protected]*<[email protected]> > > ------------------------------ > > > > Hi, Ric > > Right, string is std::string. > Why Symbol(also std::string) has the correct string and Time NOT? > > I'm debugging now, WData.Time is ""(a empty string). > > On Aug 14, 2013, at 8:54 PM, > *[email protected]*<[email protected]> > wrote: > > Is string here a std::string? If so you cannot do this as > std::string uses more memory internally, > > You'll need either a struct that uses just data arrays like: > > > typedef struct tag_WData > { > charTime[100]; > char Symbol[100]; > } WData; > > Or use some serialisation mechanism such as protocol buffers. > > Ric. > > > > <graycol.gif>liuchuanbo---14/08/2013 01:45:26 PM---Hi, everyone My > problem is as the following: > > From: *[email protected]* <[email protected]> > To: *[email protected]* <[email protected]>, > Date: 14/08/2013 01:45 PM > Subject: [zeromq-dev] PUB sent, but SUB can not receive. > Sent by: > *[email protected]*<[email protected]> > > ------------------------------ > > > > Hi, everyone > My problem is as the following: > > typedef struct tag_WData > { > string Time; > string Symbol; > } WData; > * > > On the PUB side. I can get WData.Time.* > > void OnData(WData wd) > { > // PUB Socket send ticker message to subscriber > int msgSize = sizeof(WData); > zmq::message_t message(msgSize); > memcpy ((void *) message.data(), &wd, msgSize); > > publisher.send(message); > } > * > > However, on the SUB side, it's very wired that I can NOT get > **WData.Time, > but WData.Symbol is correct.* > > int main (int argc, char *argv[]) > { > zmq::context_t context (1); // only 1 io_threads > zmq::socket_t subscriber (context, ZMQ_SUB); > subscriber.connect("*tcp://localhost:5556*"); > > subscriber.setsockopt(ZMQ_SUBSCRIBE, NULL, 0); > > WData *msg; > while(true){ > zmq::message_t message(sizeof(WData)); > subscriber.recv(&message); > msg = (WData *) message.data(); > > // it's ERROR here. error message: Bad ptr > cout << msg->Time << endl; > } > > return 0; > } > > Why? > Thanks! > > _______________________________________________ > zeromq-dev mailing list* > **[email protected]* <[email protected]>* > > **http://lists.zeromq.org/mailman/listinfo/zeromq-dev*<http://lists.zeromq.org/mailman/listinfo/zeromq-dev> > > > =========================================================== > The information in this email is confidential, and is intended > solely for the addressee(s). > Access to this email by anyone else is unauthorized and therefore > prohibited. If you are > not the intended recipient you are notified that disclosing, > copying, distributing or taking > any action in reliance on the contents of this information is > strictly prohibited and may be unlawful. > =========================================================== > > _______________________________________________ > zeromq-dev mailing list* > **[email protected]* <[email protected]>* > > **http://lists.zeromq.org/mailman/listinfo/zeromq-dev*<http://lists.zeromq.org/mailman/listinfo/zeromq-dev> > _______________________________________________ > zeromq-dev mailing list* > **[email protected]* <[email protected]>* > > **http://lists.zeromq.org/mailman/listinfo/zeromq-dev*<http://lists.zeromq.org/mailman/listinfo/zeromq-dev> > > > =========================================================== > The information in this email is confidential, and is intended solely > for the addressee(s). > Access to this email by anyone else is unauthorized and therefore > prohibited. If you are > not the intended recipient you are notified that disclosing, copying, > distributing or taking > any action in reliance on the contents of this information is strictly > prohibited and may be unlawful. > =========================================================== > > _______________________________________________ > zeromq-dev mailing list* > **[email protected]* <[email protected]> > http://lists.zeromq.org/mailman/listinfo/zeromq-dev > > > _______________________________________________ > zeromq-dev mailing list > [email protected] > http://lists.zeromq.org/mailman/listinfo/zeromq-dev > > =========================================================== > The information in this email is confidential, and is intended solely for the > addressee(s). > Access to this email by anyone else is unauthorized and therefore prohibited. > If you are > not the intended recipient you are notified that disclosing, copying, > distributing or taking > any action in reliance on the contents of this information is strictly > prohibited and may be unlawful. > =========================================================== > > > _______________________________________________ > zeromq-dev mailing list > [email protected] > http://lists.zeromq.org/mailman/listinfo/zeromq-dev > >
<<graycol.gif>>
_______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
