> ReadFully is another procedure I have written in hopes that I can then > read an entire string, word, integer, what have you and read until I > gather up enough data to continue (since I'm not using LineMode).
Your ReadFully won't work. You must think event driven. When OnDataAvailable is triggered, you must read data but you can't loop waiting for so much data to come. If you have not received enough data, just get thereceived data into a buffer and return from the event handler. When the next OnDataAvailable is triggered, you append the next data read into your buffer, until you get enough data. Basically, that's what LineMode is doing, until it has received a complete line. In addition, you have a memory leak: you allocate memory and never free it. -- [EMAIL PROTECTED] Author of ICS (Internet Component Suite, freeware) Author of MidWare (Multi-tier framework, freeware) http://www.overbyte.be ----- Original Message ----- From: "Wesley Spadola" <[EMAIL PROTECTED]> To: <email@example.com> Sent: Monday, May 30, 2005 10:39 PM Subject: [twsocket] Non-LineMode Protocol Sending and Receiving > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > > I am experimenting with writing a program that does not rely on LineMode > to send and receive data. The following procedure is attached to a > server component: > > TriggerWriteDebug is my own event, which at this time only outputs text > to a TMemo. > > Also, I plan on changing the code to except Network Byte Order numeric > data, but for now I want to get this out of the way. :-) > > procedure TMySockServer.ClientDataAvailable(Sender: TObject; ErrCode: Word); > var > I: Integer; > Buff: Array[0.._MAX_BUFF - 1] of Byte; > > begin > > TriggerWriteDebug('DataAvailable() enter...'); > > if (TMySockServerClient(Sender).State <> wsClosed) then > begin > > I := ReadFully(Sender, @Buff, 5); > > end; > > TriggerWriteDebug('DataAvailable() exit.'); > > end; > > ReadFully is another procedure I have written in hopes that I can then > read an entire string, word, integer, what have you and read until I > gather up enough data to continue (since I'm not using LineMode). > > function TMySockServer.ReadFully(Sender: TObject; Data: Pointer; > BytesExpected: Integer): Integer; > var > Buffer: PChar; > Offset: Integer; > Received: Integer; > begin > > Offset := 1; > GetMem(Buffer, BytesExpected); > > while (BytesExpected > 0) do > begin > > Received := TMySockServerClient(Sender).Receive(@Buffer[Offset], > BytesExpected); > if (Received > 0) then > begin > > Offset := Offset + Received; > BytesExpected := BytesExpected - Received; > > end; > > end; > > TriggerWriteDebug(Buffer); > Result := Offset; > > end; > > I have a couple of questions: > > When I output Buffer in the last lines of ReadFully(), if I have a > client that sends "blah!" (which is five characters), the Memo has a > non-displayable character (but shows up on the Memo as a black block) > and then 'blah!'. So I'm not sure if I'm grabbing the string correctly. > I hope with minimal changes that this procedure might also grab numbers > without error, too. > > When my test client disconnects from the server, the server enters its > ClientDataAvailable event and does not exit, which is why I have a "if > (TMySockServerClient(Sender).State <> wsClosed)" line in my > ClientDataAvailable - I was hoping that I could detect whether or not > the socket is still connected and only then try to read data. As of > right now, it stays in DataAvailable and my server goes into an infinite > loop. :( > > I realize the advantages of a LineMode = TRUE. I may just switch, but > at the current time I'm just trying to learn more about sockets and > building custom protocols in general. > > Does anyone have any advice for me to make these routines operational or > more robust? > > Cheers, > Wes > > > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.0 (MingW32) > > iD8DBQFCm3nqB5TesQcz1CoRAn5dAKDy9Likg8P8bYqcLx5m5dOSiGrT3gCgqpMm > JnYB2ex9LdhMnuX+aaNszX0= > =KZhv > -----END PGP SIGNATURE----- > > -- > 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 > -- 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