<< Alternatively, you may send your data in text form instead of binary form. It takes more space but you have no problem with line end terminator (The default CRLF is perfect) and you avoid problem with binary representation of
data which DIFFER from one processor to another processor.>> So sending records from a C program running on Linux to a Delphi app running on Windows would result in being unable to easily "unpack" the record? IOW, the C struct will not convert/translate to a Delphi record easily? If so, I think delimited strings will definitely have to be our solution. -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Francois PIETTE Sent: Saturday, November 18, 2006 7:26 AM To: ICS support mailing Subject: Re: [twsocket] Need example code for identifying a recordbeforeprocessing > All of the records have as their first member an Integer named OpCode > which > identifies itself as to which type of record it is, such as: > PInductionComplete = ^TInductionComplete; > TInductionComplete = packed record > OpCode: Integer; > Sort: Integer; > CarrierCount: Integer; > GreenLightMilliseconds: Integer; > OccupiedTrays: Integer; > RecordTerminator: Char; //This is the #126, or tilde/~ char > end; >I will be receiving a variety of structs/records, all of different sizes >and > "makeups". > > How can I (in the OnDataAvailable() handler, I assume), determine/identify > which record has just come in, so that I can process it accordingly? Just check the OpCode record member which tells what record type you have. If you have received the record, or part of the record (be sure to have received at least 4 bytes since your OpCode is an integer) into a buffer, cats the buffer address to a pointer to an integer and grab your OpCode. Somethinhg like that: MyOpCode := PInteger(@Buffer)^; > OnDataAvailable() should only fire once for each record, because I am > having > the sender add a #126 (~) as the last byte of each record, and using > LineMode with LineEnd = #126. WARNING: Since your record contains binary data, it could contains a #126 as part of the data. So the line mode will not work as you expect ! You have to make sure your record doesn't contain your termination character. You can use an "escape" mechanism for that purpose. You scan all the bytes in your data for the delimiter and replace it by another byte. Since this byte may as well be in the data, you must also substitute it. This result as having your delimiter (#126) replaced by TWO bytes: an escape character (anything you like but not #126. Let's say it is #127) and #1 (for example); and your escape character is replace by TWO of them. When you received data, you do the reverse processing: replace #127#1 by #126 and #127#127 by a single #127. Alternatively, you may send your data in text form instead of binary form. It takes more space but you have no problem with line end terminator (The default CRLF is perfect) and you avoid problem with binary representation of data which DIFFER from one processor to another processor. -- Contribute to the SSL Effort. Visit http://www.overbyte.be/eng/ssl.html -- [EMAIL PROTECTED] http://www.overbyte.be -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be
The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. If the reader of this message is not the intended recipient, you are hereby notified that your access is unauthorized, and any review, dissemination, distribution or copying of this message including any attachments is strictly prohibited. If you are not the intended recipient, please contact the sender and delete the material from any computer.
-- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be