Kei wrote: > I don't allocate the memory up to the size of the "Designated size" but > keep realloc-ing until "remaining-byte" counter reaches zero.. > Do you think I should use TStream (Stream.readbuffer, readbuffer, ...) > or just a pointer of buffer (malloc, realloc, and basic pointer > operations) ? Which one is more efficient performance-wise?
I'm not sure whether I got exactely what you mean. I mean in order to receive data in the ClientDataAvailable event a fixed sized buffer of type PChar is fine. After each successfull call to Receive I would write received data from that buffer to a file or blob stream. Since you also decrement a "remaining-byte" counter you know when everything has been received. Does this answer your question? --- Arno Garrels [TeamICS] > David > > Arno Garrels wrote: > >> Do you allocate memory up to the size of data the client intends to send? >> That would be a huge waste of memory and won't work upon large data. >> Instead receive into a buffer of let's say 8 kb and write it to your >> stream at once, receive next chunk and so on. You don't have to take care >> of packet size, it's something on a lower layer encapsulated by winsock. >> >> --- >> Arno Garrels [TeamICS] >> >> >> >> >>> Thanks! >>> >>> David >>> >>> Wilfried Mestdagh wrote: >>> >>> >>> >>>> Hello David, >>>> >>>> >>>> >>>> >>>> >>>>> How do I know the maximum size possible? >>>>> >>>>> >>>>> >>>>> >>>> at receiving side, specially depending on the speed of your own program >>>> you mostly never get above 8 kb. However I have seen receiving packets >>>> 10 time as high. But you dont have to care mutch, if you receive not >>>> all, then OnDataAvailable is immediatly called again, meaning if you >>>> have a temporary buffer that is to small, however if you receive on the >>>> stack then you can make him (almost) as large you wants. >>>> >>>> >>>> >>>> >>>> >>>>> I certainly don't want to malloc 100KB for a TCP packet... >>>>> >>>>> >>>>> >>>>> >>>> See above, you dont need to. >>>> >>>> --- >>>> Rgds, Wilfried [TeamICS] >>>> http://www.overbyte.be/eng/overbyte/teamics.html >>>> http://www.mestdagh.biz >>>> >>>> Saturday, October 29, 2005, 20:25, Kei wrote: >>>> >>>> >>>> >>>> >>>> >>>>> Hi! >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>>> I think I'm going to accept the reality that... TCP packets are >>>>> splitted into arbitrary sizes.. but!!! >>>>> How do I know the maximum size possible? What is the maximum size >>>>> that a packet can be? I certainly don't want to malloc 100KB for a TCP >>>>> packet... >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>>> Thanks! >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>>> David >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>>> Wilfried Mestdagh wrote: >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>>>> Hello David, >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> Hi! I'm new to ICS! >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> Welcome to the group :) >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> A->>B: msg hello >>>>>>> B->>A: msg yo! how's it going? >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> Yes that's the way to go. Design a user made proto for what you >>>>>> intend to do. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> If A is larger than the default buffer size (256 chars) then the A >>>>>>> (sender) will warn B in advance >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> You can do that, but is not nececary. Also you will maybe have a very >>>>>> mutch allocation / deallocation of memory and you can eventually end >>>>>> up with fragmented memory where you have not a nice large block in >>>>>> it at the moment you need it. But it can work, just think over >>>>>> carefully. A better idea is often to make a receive buffer that >>>>>> grows automatically if (and only if) needed, and then just reuse >>>>>> that buffer over and over again. Then you have some (re)allocation >>>>>> in begin but then stable. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> TWSocket will automatically split it into packets, >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> Winsock will split in packets as large as the MTU (around 1500 >>>>>> bytes). Eventually data can (and will if high speed) arrive as 1 >>>>>> large packet but not necacarely. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> I really want the sender side to send the 1MB file all at once, >>>>>>> since I do the FileWrite() right after Receive().... >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> No you cannot. Winsock does not respect packet boundaries, but (see >>>>>> prior paragraph) there are no megabytes TCP packets. >>>>>> >>>>>> You have to receive all data chuncks into a buffer, and when you >>>>>> received them all then you save to file (or save every packet direct >>>>>> to disk). There is no problem to know the moment of close the file >>>>>> because you know the length of the data from your protocol. >>>>>> >>>>>> --- >>>>>> Rgds, Wilfried [TeamICS] >>>>>> http://www.overbyte.be/eng/overbyte/teamics.html >>>>>> http://www.mestdagh.biz >>>>>> >>>>>> Saturday, October 29, 2005, 11:01, Kei wrote: >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> Hi! I'm new to ICS! >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> I am designing a simple protocol that will be mainly used locally >>>>>>> (as a database server backend)..so I'm guessing I could send up to >>>>>>> 2GB of stuff without hassle (BLOBs, for example). Right now I'm just >>>>>>> experimenting with the facility for two parties to effectively >>>>>>> "talk" to each other, even with long long messages, and with binary >>>>>>> data transfer. For example, for sending a message, the command is >>>>>>> "msg [text]" >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> A->>B: msg hello >>>>>> B->>A: msg yo! how's it going? >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> If A is larger than the default buffer size (256 chars) then the A >>>>>>> (sender) will warn B in advance, like this: "hey! I'm gonna send you >>>>>>> 10000 bytes of text" >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> A->>B: longmsg 10000 >>>>>> B->>A: ready msg >>>>>> A->>B: msg blahblahblah...........blah! >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> In this case, B will be notified of the text size, then when >>>>>>> OnClientDataAvailable() event comes, it will malloc a bigger buffer, >>>>>>> then Receive(CustomSized_Buffer, SizeHeToldMe). Similarly Im >>>>>>> considering the same mechanism to send binary data. But if the file >>>>>>> is slightly >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> larger (>>10KB) then TWSocket will automatically split it into >>>>>> packets, >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> which I don't want it to do: >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> A->>B: upload 1048576 picture.jpg >>>>>> B->>A: ready upload >>>>>> A->>B: 01001010101010.. (10720 bytes) >>>>>> A->>B: 11111010101012.. (10720 bytes) >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> A->>B: 01001010101010.. (4023 bytes) >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> I really want the sender side to send the 1MB file all at once, >>>>>>> since I do the FileWrite() right after Receive().... >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> Could anybody please help me on this issue? >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> Thanks! >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> David -- 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