From: Joel VanderWerf Date: 2006-02-02T05:16:08+09:00 Subject: Re: IO and non-strings --------------050008050507030801040101 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit ara.t.howard@noaa.gov wrote: > On Thu, 2 Feb 2006, Joel VanderWerf wrote: > >> I am in the habit of using send/recv, which are unbuffered, and also >> sending a length field before the data. If you're interested, I've got a >> couple of classes (subclasses of TCPSocket and TCPServer) that >> encapsulate this and are pretty well tested. (Also a C version of the >> same thing.) > > please share! i just wrote that, for like the 10th time, last month ;-) > > -a > MTCP -- Message TCP -- Wrapper around TCPSocket and TCPServer that provides a message (datagram) abstraction implemented by data stream with added length fields. Here's the ruby version, attached. There's a tarball at http://redshift.sourceforge.net/mtcp/ with the full deal: c version, tests for both, etc. The c version works with both blocking and non-blocking sockets. The c lib code works on windows, but the test doesn't (it forks). It's fine on linux and qnx. The ruby version works on all platforms I've tried (windows and linux). -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407 --------------050008050507030801040101 Content-Type: application/x-ruby; name="mtcp.rb" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="mtcp.rb" cmVxdWlyZSAnc29ja2V0JwoKIyA9PT0gTVRDUCAtLSBNZXNzYWdlIFRDUAojCiMgV3JhcHBl ciBhcm91bmQgVENQU29ja2V0IGFuZCBUQ1BTZXJ2ZXIgdGhhdCBwcm92aWRlcyBhIG1lc3Nh Z2UgKGRhdGFncmFtKQojIGFic3RyYWN0aW9uIGltcGxlbWVudGVkIGJ5IGRhdGEgc3RyZWFt Lgptb2R1bGUgTVRDUAoKICBjbGFzcyBNZXNzYWdlTGVuZ3RoRXJyb3IgPCBTdGFuZGFyZEVy cm9yOyBlbmQKICBjbGFzcyBNZXNzYWdlVW5kZXJmbG93IDwgU3RhbmRhcmRFcnJvcjsgZW5k CgogICMgT3ZlcnJpZGVzIHNvbWUgbWV0aG9kcyB0byBnaXZlIG1lc3NhZ2Utb3JpZW50ZWQg YmVoYXZpb3IgdG8gYSBzdHJlYW0tCiAgIyBvcmllbnRlZCBwcm90b2NvbC4KICBtb2R1bGUg TWVzc2FnZWFibGUKCiAgICBNQVhMRU4gID0gNjU1MzUgIyMjIDwtLS0gY29uZmlndXJlIGFz IGRlc2lyZWQhCiAgICBMRU5fTEVOID0gWzBdLnBhY2soIk4iKS5zaXplCgogICAgIyBTZW5k IGEgbWVzc2FnZSBvdmVyIHRoZSBzb2NrZXQuIFRoZSBtZXNzYWdlIGlzIGxpa2UgYSBkYXRh Z3JhbSByYXRoZXIKICAgICMgdGhhbiBhIHN0cmVhbSBvZiBkYXRhLgogICAgZGVmIHNlbmRf bWVzc2FnZShtZXNzYWdlKQogICAgICBsZW4gPSBtZXNzYWdlLmxlbmd0aAogICAgICBpZiBs ZW4gPiBNQVhMRU4KICAgICAgICByYWlzZSBNZXNzYWdlTGVuZ3RoRXJyb3IsICJNQVhMRU4g ZXhjZWVkZWQ6ICN7bGVufSA+ICN7TUFYTEVOfSIKICAgICAgZW5kCiAgICAgIHNlbmQoW2xl bl0ucGFjaygiTiIpLCAwKQogICAgICBzZW5kKG1lc3NhZ2UsIDApCiAgICBlbmQKCiAgICAj IFJlY2VpdmUgYSBtZXNzYWdlIGZyb20gdGhlIHNvY2tldC4gUmV0dXJucyArbmlsKyB3aGVu IHRoZXJlIGFyZSBubwogICAgIyBtb3JlIG1lc3NhZ2VzICh0aGUgd3JpdGVyIGhhcyBjbG9z ZWQgaXRzIGVuZCBvZiB0aGUgc29ja2V0KS4KICAgIGRlZiByZWN2X21lc3NhZ2UKICAgICAg aWYgKGRhdGEgPSByZWN2KExFTl9MRU4pKQogICAgICAgIGlmIGRhdGEuZW1wdHk/CiAgICAg ICAgICBuaWwKICAgICAgICBlbHNlCiAgICAgICAgICBsZW4gPSBkYXRhLnVucGFjaygiTiIp WzBdCiAgICAgICAgICBpZiBsZW4gPiBNQVhMRU4KICAgICAgICAgICAgcmFpc2UgTWVzc2Fn ZUxlbmd0aEVycm9yLCAiTUFYTEVOIGV4Y2VlZGVkOiAje2xlbn0gPiAje01BWExFTn0iCiAg ICAgICAgICBlbmQKICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgIG1zZyA9ICIiCiAgICAg ICAgICAgIHBhcnQgPSBuaWwKICAgICAgICAgICAgd2hpbGUgbXNnLmxlbmd0aCA8IGxlbiBh bmQgKHBhcnQgPSByZWN2KGxlbikpCiAgICAgICAgICAgICAgaWYgcGFydC5sZW5ndGggPT0g MCAjIyB3aGF0IGNhdXNlcyB0aGlzPwogICAgICAgICAgICAgICAgcmFpc2UgTWVzc2FnZVVu ZGVyZmxvdywKICAgICAgICAgICAgICAgICAgIlBlZXIgY2xvc2VkIHNvY2tldCBiZWZvcmUg ZmluaXNoaW5nIG1lc3NhZ2UgLS0iICsKICAgICAgICAgICAgICAgICAgIiByZWNlaXZlZCAj e21zZy5sZW5ndGh9IG9mICN7bGVufSBieXRlczpcbiIgKwogICAgICAgICAgICAgICAgICBt c2dbMC4uOTldLnVucGFjaygiSCoiKVswXSArICIuLi4iCiAgICAgICAgICAgICAgZW5kCiAg ICAgICAgICAgICAgbXNnIDw8IHBhcnQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIG1z Zy5lbXB0eT8gPyBuaWwgOiBtc2cKICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgICBl bmQKICAgIGVuZAogIGVuZAoKICBjbGFzcyBTb2NrZXQgPCBUQ1BTb2NrZXQKICAgIGluY2x1 ZGUgTWVzc2FnZWFibGUKICBlbmQKCiAgY2xhc3MgU2VydmVyIDwgVENQU2VydmVyCiAgICBp bmNsdWRlIE1lc3NhZ2VhYmxlCgogICAgaWYgZGVmaW5lZD8oRXJybm86OkVQUk9UTykKICAg ICAgRXByb3RvID0gRXJybm86OkVQUk9UTwogICAgZWxzZQogICAgICBjbGFzcyBFcHJvdG8g PCBFeGNlcHRpb247IGVuZAogICAgZW5kCgogICAgIyBUaGUgc2FtZSBhcyBUQ1BTZXJ2ZXIj YWNjZXB0LCBidXQgcmV0dXJucyBhIE1UQ1A6OlNvY2tldCBpbnN0ZWFkLgogICAgIyBBbHNv LCBhdXRvbWF0aWNhbGx5IHJldHJpZXMgb24gRVBST1RPLgogICAgZGVmIGFjY2VwdAogICAg ICBTb2NrZXQuZm9yX2ZkKHN5c2FjY2VwdCkKICAgIHJlc2N1ZSBFcHJvdG8KICAgICAgcmV0 cnkKICAgIGVuZAoKICAgIGRlZiBzZWxmLm9wZW4oKmFyZ3MpCiAgICAgIHN1cGVyCiAgICBy ZXNjdWUgU3lzdGVtQ2FsbEVycm9yID0+IGUKICAgICAgZS5tZXNzYWdlIDw8ICIgLS0gd2Fz IHRyeWluZyAje2FyZ3Muam9pbigiOiIpfSIKICAgICAgcmFpc2UgZQogICAgZW5kCgogICAg ZGVmIHNlbGYubmV3KCphcmdzKQogICAgICBzdXBlcgogICAgcmVzY3VlIFN5c3RlbUNhbGxF cnJvciA9PiBlCiAgICAgIGUubWVzc2FnZSA8PCAiIC0tIHdhcyB0cnlpbmcgI3thcmdzLmpv aW4oIjoiKX0iCiAgICAgIHJhaXNlIGUKICAgIGVuZAogIGVuZAoKZW5kCg== --------------050008050507030801040101--