On inspection, your code seems fine. (Why you bother to create a mmChar instead of just passing mmStr.data(), mmStr.length() to send is unclear to me, but I'm guessing you're trying to replicate the larger codebase.) It's been long enough that I don't remember off-hand if send() is guaranteed to send everything on a TCP socket (it definitely isn't if you've set a E_NONBLOCK flag on the fd, or on a non-SOCK_STREAM/SEQPACKET socket). Of course a signal to the process would definitely make send return early though, so to be safe you need a retry loop around it.
I would _really_ recommend looking at tcpdump output to make sure that the full data is sent instead of speculating though. And also to make the server end print the data received. -ilia On Wed, Mar 12, 2014 at 10:20 AM, Ke Wang <[email protected]> wrote: > OK, Thanks. Let me post my code here a little bit: > > message MatrixMsg > { > required string msgType = 1; > optional int64 count = 2; > optional string extraInfo = 3; > message TaskMsg > { > required string taskId = 1; > required string user = 2; > required string dir = 3; > required string cmd = 4; > required int64 dataLength = 5; > } > repeated TaskMsg tasks = 4; > } > > In my code, at some place, I did something like the following: > > MatrixMsg mm; > mm.set_msgtype("client send task"); > mm.set_count(100); > > for (int i = 0; i < 100; i++) > { > MatrixMsg_TaskMsg *tm = mm.add_tasks(); > tm->set_taskid("someid"); > tm->set_user("kwang"); > tm->set_dir("somedir"); > tm->set_cmd("somecmd"); > tm->set_datalength(0); > } > > string mmStr = mm.SerializeAsString(); > char *mmChar = new char[mmStr.length()]; > > for (int i = 0; i < mmStr.length(); i+=) > { > mmChar[i] = mmStr[i]; > } > > /* > create some socket "sockfd" here > */ > > send(sockfd, mmChar, mmStr.length(), 0); > > Now, at the sever side, I still received the message that got truncated. > Does that mean the server hasn't finished received the whole data in > "mmChar", do I need to do a loop receive until I get all the messages? > Thanks! > > Ke > > On Wednesday, March 12, 2014 8:56:32 AM UTC-5, Ilia Mirkin wrote: >> >> On Wed, Mar 12, 2014 at 9:48 AM, Ke Wang <[email protected]> wrote: >> > Thanks, but when I print out the char* using string.data(), it got >> > truncated >> > too. >> >> Right... most print functions will stop when they see a null >> character... you can't use printf/cout/etc -- you'd have to write a >> custom print mechanism that e.g. printed out hex. For example >> >> void print_data(const std::string& str) { >> for (int i = 0; i < str.length(); i++) { >> if (i && (i % 20) == 0) printf("\n"); >> printf("%02X ", str[i]); >> } >> if (i % 20) printf("\n"); >> } >> >> Or something along those lines. (I don't actually remember if str[i] >> works, but if not, should be easy to do e.g. str.data()[i] or >> something.) >> >> > Later, I need to transfer this char* through TCP socket, which >> > apparently cannot be decoded right at the server side. Did I do >> > something >> > wrong with the definition of the message? >> >> Check what data is sent over the socket with e.g. tcpdump and make >> sure that it's the data you expect. Make sure that if you're never >> handling the string as a char*. It needs to always be a (char *, >> length) pair (which is essentially what std::string is). Otherwise the >> implicit termination of c-style strings (0 byte) will break things. >> >> -ilia > > -- > You received this message because you are subscribed to the Google Groups > "Protocol Buffers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/protobuf. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
