# New sockets.cs patch submission

**URL:** <https://www.ruby-forum.com/t/new-sockets-cs-patch-submission/126034>\
**Category:** IronRuby\
**Created:** [January 14, 2008, 10:30pm UTC](https://www.ruby-forum.com/t/new-sockets-cs-patch-submission/126034 "2008-01-14T22:30:34Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Terence\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/439d5e/32.png) [@Terence\_L](https://www.ruby-forum.com/u/Terence_L)\
**Post date:** [January 14, 2008, 10:30pm UTC](https://www.ruby-forum.com/t/new-sockets-cs-patch-submission/126034/1 "2008-01-14T22:30:34Z")

</div>

Hello list,

Please find attached another patch for Socket.cs with the following  
changes:

1. Added class SocketStream : System.IO.Stream which wraps the socket  
and provides some stream-like functionality which RubyIO can use. I’ve  
tested the following methods and they appear to work well now on  
sockets:

- readline
- readlines
- gets  
puts also works, but I’m not as confident that it’s correct - see  
below under “Issues”. I’ve also included a test file I used to compare  
output between ruby.exe and rbx.exe (I tested against a default  
install of IE7 - which returns a 404 for the address requested and  
both executables appear to produce the same output except for  
line-ending issues)

1. Fixed up the spacing/tabbing issues in the file as per Seo’s  
comments - everything is now 4 spaces and no tabs, and I also moved  
the opening curly braces up to match the style in the rest of the  
solution.

I know this code isn’t perfect - but I think it is a step in the right  
direction. I have some concerns about it which I’ve listed below - any  
comments or suggestions will be most welcome.

Issues:

- Can only peek 1 byte - there is no buffering of data off the socket
- I don’t know if this will have a performance / efficiency impact?
- There is no error handling code around the socket calls - is this  
OK? If not, what should be done?
- The third parameter passed to RubyIO’s constructor - “r+” - what  
should this be? “r+” allows me to read and write to the socket through  
the stream interface so maybe it’s OK?
- None of the IO mode checking referred to in the TODO comment above  
the SocketStream class has been implemented - I presume this means  
checking whether the socket has been shutdown either for sending or  
receiving before actually trying to do the read/write - instead of  
letting it throw an exception.
- How should I trigger a flush on write? At the moment it’s done on  
seeing a newline (hard-coded) in the stream, but I don’t think that’s  
clean or correct (certainly ruby.exe seems to send my test request  
(which has 2 newlines at the end) in one go - not in two separate  
pieces - which is the minor difference I referred to above regarding  
“puts”)…
- Not sure if Flush is efficient - should I somehow use an array  
rather than a list of bytes?

Thanks for your time

Terence

---

<div class="post-metadata">

**Author:** ![Terence\_L](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/439d5e/32.png) [@Terence\_L](https://www.ruby-forum.com/u/Terence_L)\
**Post date:** [January 20, 2008, 7:46pm UTC](https://www.ruby-forum.com/t/new-sockets-cs-patch-submission/126034/2 "2008-01-20T19:46:34Z")

</div>

By the way, the latest Rubinius specs have a host of specs for Socket et  
al:  
[http://git.rubini.us/?p=code;a=tree;f=spec/ruby/1.8/library/socket;hb=HEAD](http://git.rubini.us/?p=code;a=tree;f=spec/ruby/1.8/library/socket;hb=HEAD)  
Sadly most of them are empty at this stage. But at least it gives you  
something to start testing with.  
Pete
